Reducir velocidad CPU (cpufreqd)

Este artículo explica cómo establecer la velocidad de reloj del microprocesador a un valor menor que la velocidad de fábrica desde Linux. En mi caso, el objetivo era reducir el consumo eléctrico y el calor generado por un pequeño servidor a 2Ghz que permanece encendido 24x7.

Mi idea era reducir su velocidad de CPU a 1Ghz (la mitad), más que suficiente para las labores que ejerce este servidor (servidor de ficheros, copias de seguridad, respaldos remotos de mis webs, etc).

Como el "servidor" no tiene posibilidad de modificar la velocidad de reloj vía BIOS ni Jumpers, lo haremos con "cpufreqd" de Linux, un software que permite variar la velocidad del procesador en tiempo real. Cpufreqd permite establecer valores de velocidad fijos o dinámicos (basados en la carga y necesidades del ordenador). En nuestro caso estableceremos un límite fijo de 1Ghz.


Instalación de cpufreqd

En una Debian / Ubuntu, instalaremos los paquetes cpufreqd y cpufrequtils e insertaremos los módulos necesarios en memoria:

# apt-get install cpufreqd cpufrequtils
# modprobe p4-clockmod
# modprobe cpufreq_powersave
# echo "p4-clockmod" >> /etc/modules
# echo "cpufreq_powersave" >> /etc/modules

En el caso de nuestro servidor, hemos usado el módulo p4-clockmod porque es el módulo adecuado para nuestro hardware. En el caso de otros microprocesadores, podemos consultar la siguiente lista de hardware y el módulo asociado, sacada de la página de compatibilidad de cpufreq:


  • Generic ACPI P-States based driver (acpi-cpufreq)
  • AMD Elan - SC400, SC410 (elanfreq)
  • AMD mobile K6-2/3+ PowerNow! (powernow-k6)
  • AMD mobile Athlon PowerNow! (powernow-k7)
  • AMD Cool&Quiet PowerNow! (powernow-k8)
  • Intel SpeedStep using the SMI BIOS interface (speedstep-smi)
  • Intel SpeedStep on ICH-based chipsets (speedstep-ich)
  • Intel Enhanced SpeedStep (acpi-cpufreq and speedstep-centrino)
  • Intel Pentium4/Xeon clock modulation (p4-clockmod)
  • NatSemi Geode GX / Cyrix MediaGXm (gx-suspmod)
  • Transmeta Crusoe / Efficeon LongRun (longrun)
  • VIA Cyrix Longhaul (longhaul)
  • VIA C7 (e_powersaver)


Establecemos política a 1Ghz

Una vez cargado el módulo adecuado, establecemos un política de Powersaving, con límites inferiores y superiores de 1Ghz.

# cpufreq-set -g powersave
# cpufreq-info 
# echo "1000000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
# echo "1000000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
# cpufreq-set -f 1000 MHz

Verificamos que, efectivamente, hemos cambiado la velocidad de proceso de la CPU:

# cpufreq-info 
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
  driver: p4-clockmod
  CPUs which need to switch frequency at the same time: 0
  hardware limits: 250 MHz - 2.00 GHz
  available frequency steps: 250 MHz, 500 MHz, 750 MHz, 1000 MHz, 1.25 GHz, 
                             1.50 GHz, 1.75 GHz, 2.00 GHz
  available cpufreq governors: conservative, userspace, ondemand, 
                               powersave, performance
  current policy: frequency should be within 1000 MHz and 1000 MHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 1000 MHz (asserted by call to hardware).

root@hpserver:~/sources# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Pentium(R) 4 CPU 2.00GHz
stepping        : 4
cpu MHz         : 1000.000
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 sep (...)
bogomips        : 3999.89
clflush size    : 64
power management:

Tras esto, nos aseguramos que en el próximo arranque del sistema se establezca la velocidad a 1Ghz automáticamente. Para eso tienen que arrancar cpufreqd y cpufrequtils, y debemos modificar la configuración de este último:

# less /etc/init.d/cpufrequtils
(...)
ENABLE="true"

#GOVERNOR="ondemand"
#MAX_SPEED="0"
#MIN_SPEED="0"

GOVERNOR="powersave"
MAX_SPEED="1000000"
MIN_SPEED="1000000"
(...)

También podemos utilizar un script en el arranque (en el runlevel correspondiente) que ejecute todos los comandos necesarios por nosotros:

# cat /etc/init.d/velocidad_reloj.sh 
#!/bin/sh
# 
# Establecer velocidad de reloj a 1Ghz
#

#modprobe p4-clockmod
#modprobe cpufreq_powersave

cpufreq-set -g powersave
echo "1000000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo "1000000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
cpufreq-set -f 1000 MHz

En este caso, hemos establecido la velocidad de la CPU a 1Ghz, pero sería posible establecer otros valores o incluso que la CPU variara su velocidad en un rango de valores según las necesidades del procesador (governor on-demand).



<Volver a la sección de GNU/Linux>