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.
nano /etc/rc.local
# place this near the end before the "exit 0"
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=$(basename $CPU)
echo "CPU: $CPUID";
if test -e $CPU/online; then
echo "1" > $CPU/online;
fi;
COREID="$(cat $CPU/topology/core_id)";
eval "COREENABLE=\"\${core${COREID}enable}\"";
if ${COREENABLE:-true}; then
echo "${CPU} core=${CORE} -> enable"
eval "core${COREID}enable='false'";
else
echo "$CPU core=${CORE} -> disable";
echo "0" > "$CPU/online";
fi;
done;
¿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.
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.