Linux Deshabilitar turboboost en core i5, core i7 en Linux

zerosilent

Silent hill fan
Se incorporó
20 Junio 2006
Mensajes
790
Guía: Cómo deshabilitar turboboost en corei5, corei7 en Linux

Nota: Debido a que en la migración desde el sitio del cejotas la guía acá se borró (aparece un mensaje vacío y no deja editar, repostearé la guía completa acá).

A quién no le ha pasado que especialmente en notebooks, las temperaturas se disparan en procesadores de doble o cuádruple núcleo debido a la tecnología turboboost de intel (que overclockea el procesador solo).

En mi caso en particular, con un T420 y un 2670QM cuádruple núcleo a 2.2 ghz, las temperaturas bordaban los 90°C en el núcleo que se overclockeaba (a 3.1 ghz) bajo situación de stress extremo, por lo cual se activaba el maldito throttle del procesador (y en mi caso particular, turboboost no se puede desactivar desde bios). Esto es bastante común en laptops con i7 de 14'' (T420, E6420, Macbooks, etc...)

Las reducciones en los cambios de temperatura, si bien no me he dado el trabajo de hacer mediciones exhaustivas, han bajado en carga como mínimo 10°C (ahora en carga rozan los 80°C)

Manos a la obra:


  1. Necesitaremos de msr-tools, para los debian based users pueden obtenerlo como:

    Código:
    sudo apt-get install msr-tools

  2. Posteriormente, y para no tener que estar iniciando a cada rato con modprobe el módulo msr, se necesita que éste se inicie al inicio del sistema, por lo cual lo agregamos al archivo /etc/modules (necesitan ser sudo para editarlo, y pueden usar un editor simple como nano para editarlo).

    Un ejemplo de cómo editarlo sería llamando el siguiente comando desde consola (pueden usar su editor favorito):

    Código:
    sudo nano /etc/modules

    Éste es un ejemplo de un archivo /etc/modules, el módulo msr que está resaltado en rojo, es el que debemos agregar:

    Código:
    # /etc/modules: kernel modules to load at boot time.
    #
    # This file contains the names of kernel modules that should be loaded
    # at boot time, one per line. Lines beginning with "#" are ignored.
    
    lp
    rtc
    msr

  3. Basándose en la página: Mi mundito ? Disabling Turbo Boost in Linux, se debe utilizar el comando
    wrmsr para modificar específicamente el registro msr 0x1a0 que es el que almacena y controla si turboboost está activo o no, y cambiarlo por 0x4000850089 si queremos forzar la desactivación y por un 0x850089 si queremos forzar la activación de éste.

    La sintaxis de uso genérica para desactivar turboboost es así:

    Código:
    wrmsr -pi 0x1a0 0x4000850089

    Donde i es el thread del procesador al cual le queremos desactivar turboboost.

  4. Debido a que queremos que se ejecute al inicio, y no estar desactivando turboboost a cada rato, procedemos a editar el archivo /etc/rc.local las 7 líneas con las ejecuciones de wrmsr para que turboboost se desactive al inicio del sistema.

    Un ejemplo de cómo editarlo sería llamando el siguiente comando desde consola (pueden usar su editor favorito):

    Código:
    sudo nano /etc/rc.local

    Para mi caso en particular, como el 2670QM tiene 4 cores físicos y 4 cores virtuales (es decir, 8 threads), el archivo quedaría así:

    Código:
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    #Disable turboboost using MSR
    wrmsr -p0 0x1a0 0x4000850089
    wrmsr -p1 0x1a0 0x4000850089
    wrmsr -p2 0x1a0 0x4000850089
    wrmsr -p3 0x1a0 0x4000850089
    wrmsr -p4 0x1a0 0x4000850089
    wrmsr -p5 0x1a0 0x4000850089
    wrmsr -p6 0x1a0 0x4000850089
    wrmsr -p7 0x1a0 0x4000850089
    exit 0

    Notar que tuve que en mi caso tengo 8 threads, por lo cual tuve que repetir 8 veces el comando wrmsr descrito en rojo (en caso de un i5, sólo debiesen hacerlo 4 veces, desde p0 a p3).

  5. Deshabilitando el turboboost de la GPU:

    Lo primero es montar debugfs para debuguear módulos del kernel (la idea de ésto es cambiar el clock de la gpu en el kernel en tiempo de ejecución).

    Ésto se hace editando el archivo /etc/fstab con su editor favorito (en mi caso nano, noten que deben hacerlo como super usuario):

    Código:
    sudo nano /etc/fstab

    Y agregando la siguiente línea al final del archivo fstab:

    Código:
    debugfs /sys/kernel/debug debugfs defaults 0 0

    Ahora reiniciamos el pc, y teniendo acceso a debugfs, para deshabilitar el turboboost de la GPU deben averiguar la frecuencia máxima y mínima que anda su gpu. Esto pueden hacerlo con:

    Código:
    cat  /sys/kernel/debug/dri/0/i915_min_freq

    Código:
    cat  /sys/kernel/debug/dri/0/i915_max_freq

    Justamente i915_min_freq tiene la frecuencia normal de su gpu sin turboboost, por lo cual la idea es "copiar" la frecuencia de i915_min_freq a la frecuencia máxima permitida en i915_max_freq (que se alcanza justamente sólo con turboboost):

    En mi caso como tengo una HD3000, la frecuencia normal sin boost es de 650, por lo que lo único que deben hacer es agregar el siguiente comando a su archivo /etc/rc.local

    Código:
    echo "650" > /sys/kernel/debug/dri/0/i915_max_freq

    Por lo que les quedaría así:

    Código:
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    #Disable turboboost using MSR
    wrmsr -p0 0x1a0 0x4000850089
    wrmsr -p1 0x1a0 0x4000850089
    wrmsr -p2 0x1a0 0x4000850089
    wrmsr -p3 0x1a0 0x4000850089
    wrmsr -p4 0x1a0 0x4000850089
    wrmsr -p5 0x1a0 0x4000850089
    wrmsr -p6 0x1a0 0x4000850089
    wrmsr -p7 0x1a0 0x4000850089
    #Disable gpu turboboost
    echo "650" > /sys/kernel/debug/dri/0/i915_max_freq
    exit 0

    Nota: Si no les funciona en /etc/rc.local, deben agregar la línea en /etc/init.d/rc.local:

    Código:
    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:  rc.local
    # Required-Start:  $all
    # Required-Stop:
    # Default-Start:  2 3 4 5
    # Default-Stop:
    # Short-Description: Run /etc/rc.local if it exist
    ### END INIT INFO
    
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    
    . /lib/init/vars.sh
    . /lib/lsb/init-functions
    
    echo "650" > /sys/kernel/debug/dri/0/i915_max_freq
    
    do_start() {
       if [ -x /etc/rc.local ]; then
        [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
         /etc/rc.local
         ES=$?
         [ "$VERBOSE" != no ] && log_end_msg $ES
         return $ES
       fi
    }
    
    case "$1" in
      start)
       do_start
      ;;
      restart|reload|force-reload)
      echo "Error: argument '$1' not supported" >&2
      exit 3
      ;;
      stop)
      ;;
      *)
      echo "Usage: $0 start|stop" >&2
      exit 3
      ;;
    esac


  6. Reinicien su sistema. Al reiniciar su sistema pueden comprobar si turboboost está activo o no con el siguiente comando (Por lo general cpufreq no detecta la velocidad del turboboost, por lo cual no es una medida para saber si está activo o no):
    Código:
    rdmsr -pi 0x1a0 -f 38:38
    Si les retorna un 1, significa que turboboost está desactivado.
    Si les retorna un 0, significa que turboboost está activado.

    Donde de nuevo, i se refiere a un thread en específico, por lo cual tendrán que ejecutar n veces como n threads tenga su procesador.

    Ejemplo en mi caso:
    Código:
    jesus@thinkpadzote ~ $ sudo rdmsr -p0 0x1a0 -f 38:38
    1

    Lo que implica en mi caso que para el thread 0, turboboost está desactivado, por lo cual comprobando para los otros 7 threads más (que en realidad no es tan necesario de hacer), al fin turboboost está deshabilitado en nuestro sistema, yay!

    Nota extra: Añadí un copper shim a mi procesador, junto con usar tpfancontrol y la baja de temperaturas es aún más notable, enseñando a instalar y usar tpfancontrol en linux podría hacer otra guía :D

  7. Deshabilitando usando intel_pstate:

    Una forma más simple es usando el siguiente comando:
    Código:
    echo "1" > /sys/devices/system/cpu/intel_pstate/no_turbo

    Donde 1 es turboboost disabled y 0 es turboboost enabled. Por un tema de seguridad uso ambos en el archivo /etc/rc.local por lo que finalmente nuestro archivo rc.local final nos quedará así:


    Código:
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    #Disable turboboost using MSR
    wrmsr -p0 0x1a0 0x4000850089
    wrmsr -p1 0x1a0 0x4000850089
    wrmsr -p2 0x1a0 0x4000850089
    wrmsr -p3 0x1a0 0x4000850089
    wrmsr -p4 0x1a0 0x4000850089
    wrmsr -p5 0x1a0 0x4000850089
    wrmsr -p6 0x1a0 0x4000850089
    wrmsr -p7 0x1a0 0x4000850089
    #Disable cpu turboboost using intel_pstate
    echo "1" > /sys/devices/system/cpu/intel_pstate/no_turbo
    #Disable gpu turboboost
    echo "650" > /sys/kernel/debug/dri/0/i915_max_freq
    exit 0

  8. EXTRA:
    Falta hacer que funcione al suspender, a veces al volver del estado de suspensión se vuelve a habilitar turboboost, por lo cual hay que crear el siguiente archivo:

    /etc/pm/sleep.d/60rc.local
    Código:
    #!/bin/sh
    
    . "${PM_FUNCTIONS}"
    
    case $1 in
      resume|thaw)
      [ -e /etc/rc.local ] && /etc/rc.local &
      ;;
      *)
      exit $NA
      ;;
    esac
    exit 0
    darle por supuesto chmod +x de permiso al archivo.


    P.d: Añadí info de cómo deshabilitar el turboboost de la GPU (pueden probarla con furmark)
 
Última modificación:

Ratonator

Gold Member
Se incorporó
15 Octubre 2004
Mensajes
10.791
Puta que es bosta esa wea de Turboboost en notebooks, en Mac OSX, sucede lo mismo, y ni se pa que, si con los 1300 Mhz del Intel Core Haswell, Mac OSX corre perfectamente. Pero con Turboboost, se va a la remierda el consumo y las temperaturas.

Lo peor es que tipico que suceda cuando se usa flash, y todas las paginas tienen algun contenido flash.

Se agradece el aporte
 
Upvote 0

zerosilent

Silent hill fan
Se incorporó
20 Junio 2006
Mensajes
790
Actualicé parte de la guía para deshabilitar el turboboost de la gpu y también para deshabilitar turboboost usando intel_pstate.

Puede que hayan pasos de más en la guía,pero los descensos en temperaturas en mi caso fueron enormes sin pérdidas de rendimiento. Deshabilitar el turboboost en la gpu hizo reducir aún más mis temperaturas.

También arreglé unos bugs en la guía respecto al cómo montar debugfs antes de poder apagar turboboost en la integrada de video.
 
Última modificación:
Upvote 0
Subir