Saltar al contenido

Deshabilite el hyperthreading desde Linux (sin acceso al BIOS)

Es imprescindible interpretar el código bien antes de aplicarlo a tu trabajo y si tdeseas aportar algo puedes dejarlo en la sección de comentarios.

Solución:

Solución 1:

Puede hacer esto en tiempo de ejecución si lo desea. Encontré una buena solución descrita aquí: http://www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/

Paso 1: Identifique las CPU de Linux que desea apagar:

cat /proc/cpuinfo

Busque las CPU que tengan el mismo “ID de núcleo”, desea apagar una de cada par.

Paso 2: Apague las CPU de hyperthreading (en mi caso, las últimas cuatro del total de 8 “CPU” vistas por Linux)

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

Puede configurar usted mismo un script que ejecute justo después del inicio del sistema.

Solucion 2:

Los núcleos más nuevos proporcionan un control de subprocesos múltiples simultáneos (SMT).

Puede comprobar el estado de SMT con;

cat /sys/devices/system/cpu/smt/active

Cambia el estado con

echo off > /sys/devices/system/cpu/smt/control

Las opciones son;

  • sobre
  • apagado
  • forzar fuera

Hemos probado esto con Linux Kernel 4.4.0


Solución 3:

Un script para deshabilitar el hyperthreading en el inicio de la máquina …

Para deshabilitar el 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 Linux moderna.

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$COREIDenable"";
        if $COREENABLE:-true; then        
                echo "$CPU core=$CORE -> enable"
                eval "core$COREIDenable='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 y los controles del kernel para la CPU lógica 3.

cat / sys / devices / system / cpu / cpu3 / topology / core_id
mostrará el número de núcleo al que pertenece esta CPU lógica.

echo “0”> / sys / devices / system / cpu / cpu3 / online
permite desactivar la CPU lógica 3.

¿Por qué funciona?

No sé exactamente por qué … pero el sistema se vuelve más receptivo con hyperthreading desactivado (en mi portátil i5 y servidores Xeon masivos con más de 60 núcleos). Supongo que tiene que ver con cachés por cpu, asignación de memoria por cpu, asignación de programador de cpu y prioridades de proceso, iteraciones complejas. Creo que los beneficios del hyperthreading son superados por la complejidad de crear programadores de CPU que sepan cómo usarlo.

Para mí, el problema con el hyperthreading es: si comienzo tantos subprocesos intensivos en cpu como núcleos lógicos, tendré cambios de contexto rápidos para las tareas intensivas en cpu, pero costosos para las tareas en segundo plano, ya que el hyperthreading consumido por completo por el Tareas intensivas en CPU. 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 de contexto rápidos 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 de inmediato. Es como si fueran un rendimiento en tiempo real (agradable -20).

En el primer escenario, el hyperthreading se usa, las tareas en segundo plano usará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 se prioriza 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). Renderizado de Blender en computadoras y clusters baratos (para dibujar mi futura casa).

Además, esto es una conjetura.

Tengo la impresión de que es mejor, pero puede que no.


Solución 4:

Para kernels realmente antiguos (Linux 2.6.9 o así), agregue el noht parámetro al kernel en el arranque.

Esta opción de línea de comandos del kernel se ha eliminado al menos desde Linux 2.6.18.


De http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html:

The `noht' Argument

This will disable hyper-threading on intel processors that have this feature. 

Si usa lilo, edite /etc/lilo.conf (y luego ejecute lilo) o si usa grub, edite su /boot/grub/menu.lst.


Solución 5:

Puede usar “thread_siblings_list” para cada núcleo para apagar el segundo núcleo en el par HT.

La siguiente canalización de comandos es pirateada, no optimizada y, con suerte, se hace de esta manera para que sea más fácil de entender.

cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | 
awk -F, 'print $2' | 
sort -n | 
uniq | 
( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )

por lo tanto, 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, el número de núcleos se reduce a la mitad.

valoraciones y reseñas

Más adelante puedes encontrar las notas de otros sys admins, tú aún eres capaz insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *