Tengo un sistema que ejecuta una aplicación de comercio financiero en una instalación remota. No tengo acceso a la OIT / DRAC, pero necesito deshabilitar hyperthreading. El sistema ejecuta CPUs Intel Westmere 3.33GHz X5680 de núcleo hexagonal. Puedo reiniciar, pero quiero asegurarme de que el sistema no permita el hyperthreading debido a problemas de rendimiento. ¿Hay una manera limpia de hacer esto desde Linux?
Editar: la noht
directiva agregada a la línea de comando de arranque del núcleo no funcionó. Lo mismo para RHEL.
sysbench --num-threads=1 --test=cpu run
con diferentes hilos numéricos y HT activado y desactivado dice que deshabilitar HT disminuye el rendimiento cuando hay muchos hilos, e incluso si solo hay un hilo no hay ningún beneficio en desactivar HT. Así que sugiero dejarlo como está: es óptimo.echo 1
lugar deecho 0
volver a encenderlos.Un script para deshabilitar hyperthreading en el inicio de la máquina ...
Para deshabilitar hyperthreading, incluyo un script en la máquina /etc/rc.local. No es exactamente limpio, pero es fácil de instalar, independiente de la arquitectura de la CPU y debería funcionar en cualquier distribución moderna de Linux.
¿Cómo funciona esto?
Se puede acceder a la información y los controles del kernel de Linux como archivos en el directorio / sys en las distribuciones modernas de Linux. Por ejemplo:
/ sys / devices / system / cpu / cpu3 contiene la información del núcleo y los controles para la CPU lógica 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id mostrará el número central al que pertenece esta CPU lógica.
echo "0"> / sys / devices / system / cpu / cpu3 / online permite deshabilitar la CPU lógica 3.
Por que funciona
No sé exactamente por qué ... pero el sistema se vuelve más receptivo con hyperthreading apagado (en mi computadora portátil i5 y servidores Xeon masivos con más de 60 núcleos). Supongo que eso tiene que ver con cachés por CPU, asignación de memoria por CPU, asignación del planificador de CPU y iteraciones complejas de prioridades de proceso. Creo que los beneficios de hyperthreading son mayores que la complejidad de hacer programadores de CPU que saben cómo usarlo.
Para mí, el problema con hyperthreading es: si inicio tantos subprocesos intensivos en CPU como núcleos lógicos, tendré cambios rápidos de contexto para las tareas intensivas en CPU, pero costosos para las tareas en segundo plano ya que el hyperthreading totalmente consumido por el CPU tareas intensivas. Por otro lado, si inicio tantos subprocesos intensivos en CPU como núcleos físicos, no tendré cambios de contexto para esas tareas y cambios rápidos de contexto para las tareas en segundo plano. Parece bueno, pero las tareas en segundo plano encontrarán procesadores lógicos libres y se ejecutarán casi inmediatamente. Es como si fueran en tiempo real (bonito -20).
En el primer escenario, el hyperthreading es uselles, las tareas en segundo plano utilizarán costosos cambios de contexto porque maximicé el hyperthreading con el procesamiento normal. El segundo es inaceptable porque hasta el 50% de la potencia de mi CPU tiene prioridad para las tareas en segundo plano.
Las tareas "intensivas en CPU" de las que estoy hablando son servidores de autorización y minería de datos de inteligencia artificial (mi trabajo). Representación de Blender en computadoras y clústeres baratos (para dibujar mi futura casa).
Además, esto es conjeturas.
Tengo la impresión de que es mejor, pero puede que no.
fuente
Para núcleos realmente antiguos (Linux 2.6.9 más o menos), agregue el parámetro noht al núcleo en el arranque.
Esta opción de línea de comandos del núcleo se ha eliminado desde al menos Linux 2.6.18 .
De http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Si usa lilo edite /etc/lilo.conf (y ejecute lilo después) o si usa grub, edite su /boot/grub/menu.lst.
fuente
noht
entrada en la línea de comando del núcleo grub. El sistema no cumplió con elnoht
comando. Lo mismo para RHEL. Ver: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
opción del núcleo fue eliminada. Esto es desafortunado, porque Linux habilita una solución alternativa para algunas erratas de contador de rendimiento Haswell (BJ122, BV98, HSD29) solo si HT está activado , y esto sucede antes de que se inicie initramfs.Puede usar "thread_siblings_list" para cada núcleo para desactivar el segundo núcleo en el par HT.
La siguiente línea de comandos es hacky, no está optimizada y se hace de esta manera con la esperanza de que sea más fácil de entender.
entonces, tome todas las listas de hermanos de subprocesos, extraiga la segunda CPU para cada par, obtenga una lista única y luego apáguelos.
¿Esto tiene sentido?
si hago "cat / proc / cpuinfo" después de ejecutar lo anterior, la cantidad de núcleos se reduce a la mitad.
fuente
echo 0 > /sys/devices/system/cpu/cpu$X/online
se convierte enecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Los núcleos más nuevos proporcionan un control de subprocesamiento múltiple simultáneo (SMT).
Puede verificar el estado de SMT con;
Cambiar el estado con
Las opciones son;
Hemos probado esto con Linux Kernel 4.4.0
fuente
La respuesta de Lukas es buena, pero en realidad no funciona para deshabilitar HT porque el ID del núcleo no puede servir para identificar a los hermanos HT. Este script funciona en su lugar:
fuente
Tuve que esperar hasta poder ingresar a la OIT / Drac. Los parámetros de arranque del kernel no funcionan en las distribuciones actuales de Linux.
fuente
En el paquete libsmbios-bin (Debian, Ubuntu, etc.), tiene los binarios isCmosTokenActive y enableCmosToken. Junto con la lista de tokens , puede intentar algo como esto:
Luego active el token CPU_Hyperthreading_Disable:
Verificar:
Ahora, la gran pregunta es si simplemente necesita reiniciar para que esto surta efecto, o si se requiere un ciclo de energía completo. ¡Pruébalo y mira cómo va!
fuente
Según la información proporcionada por Paul M aquí, lo "guionaría" de esta manera:
Por supuesto , no está desactivando el hiperprocesamiento en el mismo sentido que lo haría con el BIOS , básicamente solo le dice al programador de tareas del núcleo que no use algunos núcleos porque sabemos que son falsos.
El software que hizo su suposición basándose en el estado anterior
/proc
o en el/sys
subsistema aún podría estar funcionando por debajo del óptimo o incluso fallar debido a este cambio en el tiempo de ejecución, por lo que podría ser necesario reiniciarlo. Por ejemplo, me di cuenta de queirqbalance
era propenso a fallar en esas circunstancias.fuente
Deshabilitar HT:
Habilitar HT:
Nota: Esto realmente no deshabilita HyperThreading pero deshabilita los núcleos "falsos" obteniendo casi el mismo resultado.
fuente
tee
, pero esto aún no proporciona una respuesta real a la pregunta. Esos comandos solo se aplican a configuraciones de hardware específicas y pueden tener efectos no deseados en otras configuraciones de hardware. Y una explicación de lo que hacen esos comandos está completamente ausente.Viejo tema, pero tenía motivos para probar este experimento. Primero, no estoy del todo seguro de que deshabilitar las CPU (ligeramente falsas) en tiempo de ejecución sea realmente equivalente a deshabilitar Hyperthreading en el arranque. Dicho esto, vi un pequeño aumento de rendimiento en nuestra aplicación. (Pero no lo suficiente como para mantenerlo).
Usó el valor thread_siblings (común a las CPU con hipertrama) como clave para habilitar / deshabilitar:
Pruebe el comando sin el sudo sh final para verificar que sea correcto.
fuente