- 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:
- Necesitaremos de msr-tools, para los debian based users pueden obtenerlo como:
Código:sudo apt-get install msr-tools
- 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
- 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.
- 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).
- 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
- 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 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
- 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
- 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
P.d: Añadí info de cómo deshabilitar el turboboost de la GPU (pueden probarla con furmark)
Última modificación: