Los procesadores modernos cambian de frecuencia y voltaje cientos de veces por segundo para ahorrar energía cuando están poco cargados. Esa gestión la reparten el firmware, el controlador de frecuencia del kernel y el gobernador, que es la política que decide a qué velocidad debe ir cada núcleo. En este tutorial identificarás qué controlador usa tu servidor Ubuntu 24.04, cambiarás el gobernador con cpupower, medirás el efecto con turbostat, controlarás el turbo y los estados de reposo (C-states) y dejarás la configuración persistente con tuned.

Requisitos previos

  • Un servidor físico con Ubuntu 24.04 LTS y procesador Intel o AMD, por ejemplo un servidor bare metal de CubePath.
  • Un usuario no root con privilegios sudo.

Paso 1: Instalar las herramientas e identificar el controlador

cpupower y turbostat se distribuyen con las herramientas del kernel, en un paquete ligado a la versión exacta del kernel en ejecución:

sudo apt update
sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

linux-tools-generic hace que el paquete se actualice junto con el kernel, para que las herramientas sigan funcionando tras la próxima actualización. Consulta la información de frecuencia:

cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 800 MHz - 3.90 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 800 MHz and 3.90 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: 1.20 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes

Las líneas que importan son driver, available cpufreq governors y el gobernador actual. En un VPS, en cambio, verás no or unknown cpufreq driver is active on this CPU.

Paso 2: Entender controladores y gobernadores

El controlador determina qué gobernadores existen y cómo se comportan. Los habituales en Ubuntu 24.04 son:

Controlador (driver)ProcesadoresGobernadores
intel_pstate (modo activo)Intel desde Sandy Bridgeperformance, powersave
intel_cpufreqIntel con intel_pstate en modo pasivoperformance, powersave, schedutil, ondemand, conservative, userspace
amd-pstate-eppAMD Zen 2 o posterior con CPPCperformance, powersave
amd-pstateAMD Zen 2 o posterior, modo pasivo o guiadoLos mismos que intel_cpufreq
acpi-cpufreqProcesadores sin los anteriores, o si la BIOS no expone CPPCLos mismos que intel_cpufreq

Dos cosas que suelen confundirse:

  • Con intel_pstate y amd-pstate-epp en modo activo, powersave no significa ir a la frecuencia mínima. Es un gobernador dinámico: el propio procesador sube y baja la frecuencia según la carga, guiado por la preferencia de energía (EPP) que verás en el paso 4. performance le pide mantener frecuencias altas.
  • Con los controladores genéricos, schedutil es el gobernador dinámico recomendado: usa la información del planificador del kernel para decidir la frecuencia. ondemand y conservative son alternativas más antiguas.

Puedes consultar el modo de los controladores de Intel y AMD en estos archivos (solo existe el de tu fabricante):

cat /sys/devices/system/cpu/intel_pstate/status
cat /sys/devices/system/cpu/amd_pstate/status
active

Paso 3: Cambiar el gobernador y medir

Antes de cambiar nada, observa cómo se comporta la CPU con carga real. turbostat muestra la frecuencia efectiva y el consumo del paquete a partir de los contadores del procesador:

sudo turbostat --quiet --show Busy%,Avg_MHz,Bzy_MHz,PkgWatt --interval 5
Avg_MHz	Busy%	Bzy_MHz	PkgWatt
112	4.21	2661	38.47
98	3.86	2539	37.90
  • Busy%: porcentaje del tiempo en que los núcleos estuvieron ejecutando.
  • Bzy_MHz: frecuencia media mientras estaban ocupados. Es la cifra que te dice si el gobernador sube la frecuencia cuando hay trabajo.
  • PkgWatt: consumo del procesador en vatios, cuando el hardware lo expone (RAPL).

Pulsa Ctrl+C para salir. Ahora cambia el gobernador a performance en todas las CPU:

sudo cpupower frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
...

Verifica el cambio en todas las CPU a la vez. La salida debe mostrar una sola línea con el número total de CPU:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort | uniq -c
     32 performance

Vuelve a lanzar turbostat con la misma carga y compara Bzy_MHz y PkgWatt. Con performance, la frecuencia sube antes y se mantiene más alta, lo que reduce la latencia de las peticiones cortas, a cambio de más consumo en reposo. Si tu servicio es sensible a latencia (bases de datos, APIs, trading, juegos), la diferencia se nota en los percentiles altos; si es un servidor de copias o de procesamiento por lotes, a menudo no merece la pena.

Para volver al comportamiento por defecto:

sudo cpupower frequency-set -g powersave

Con los controladores genéricos (acpi-cpufreq, amd-pstate pasivo), usa schedutil en lugar de powersave para el modo dinámico.

Paso 4: Ajustar la preferencia de energía y el turbo

Energy Performance Preference (EPP)

Con los controladores en modo activo y el gobernador powersave, el procesador decide la frecuencia guiado por la EPP. Consulta los valores posibles y el actual:

cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_available_preferences
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
default performance balance_performance balance_power power
balance_performance

Un buen término medio para servidores es mantener powersave con balance_performance: la CPU baja la frecuencia en reposo pero responde rápido a la carga. Para cambiarla en todas las CPU:

echo balance_performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference

Con el gobernador performance en intel_pstate, la EPP queda fijada en performance y el kernel rechaza otros valores.

Turbo

El turbo permite superar la frecuencia base cuando hay margen térmico y de consumo. Desactivarlo reduce el rendimiento máximo, pero da una frecuencia más estable y predecible, algo útil para comparar benchmarks o en servidores con problemas térmicos. El control depende del controlador:

# intel_pstate: 0 = turbo activo, 1 = desactivado
cat /sys/devices/system/cpu/intel_pstate/no_turbo

# acpi-cpufreq y otros: 1 = turbo activo, 0 = desactivado
cat /sys/devices/system/cpu/cpufreq/boost

Para desactivarlo temporalmente en un servidor Intel:

echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo

Comprueba el efecto con turbostat: Bzy_MHz no debería superar la frecuencia base del procesador. Vuelve a escribir 0 para reactivarlo. En la mayoría de servidores conviene dejar el turbo activo.

Paso 5: Controlar los C-states

Cuando un núcleo no tiene trabajo entra en un estado de reposo (C-state). Cuanto más profundo es el estado, más energía ahorra y más tarda en despertar: desde unos pocos microsegundos en C1 hasta más de 100 µs en los más profundos. Para servicios que responden a peticiones esporádicas con latencias de microsegundos, ese tiempo de despertar se nota.

Lista los estados disponibles y su latencia de salida:

cpupower idle-info
CPUidle driver: intel_idle
CPUidle governor: menu
analyzing CPU 0:

Number of idle states: 4
Available idle states: POLL C1 C1E C6
...
C6:
Flags/Description: MWAIT 0x20
Latency: 133
Usage: 1843201
Duration: 918273645

Latency está en microsegundos. Para probar el efecto, desactiva temporalmente los estados con una latencia de salida superior a 10 µs:

sudo cpupower idle-set -D 10

Mide la latencia de tu aplicación y el consumo con turbostat. Para volver a activar todos los estados:

sudo cpupower idle-set -E

Desactivar C-states profundos aumenta el consumo en reposo y puede reducir el turbo disponible, porque los núcleos inactivos ya no ceden margen térmico a los activos. Hazlo solo si has medido una mejora real de latencia.

Paso 6: Hacer la configuración persistente con tuned

Todo lo anterior se pierde al reiniciar. En lugar de escribir scripts propios, usa tuned, un demonio que aplica perfiles de rendimiento completos (gobernador, EPP, límites de latencia de C-states y parámetros del kernel) en cada arranque:

sudo apt install tuned
sudo systemctl enable --now tuned

Lista los perfiles disponibles y el que el propio tuned recomienda para tu sistema:

tuned-adm list
tuned-adm recommend

Los perfiles más útiles en servidores son:

PerfilQué hace
balancedGobernador dinámico y EPP equilibrada. Buen valor por defecto.
throughput-performanceGobernador performance y ajustes de disco y memoria orientados a rendimiento sostenido.
latency-performanceComo el anterior, y además limita los C-states profundos para reducir la latencia de despertar.
network-latencyBasado en latency-performance, con ajustes adicionales de red para baja latencia.
powersavePrioriza el ahorro de energía.

Activa el perfil que encaje con tu carga, por ejemplo para una base de datos sensible a latencia:

sudo tuned-adm profile latency-performance

Comprueba el perfil activo y que los ajustes se han aplicado correctamente:

tuned-adm active
sudo tuned-adm verify
Current active profile: latency-performance
Verification succeeded, current system settings match the preset profile.
See TuneD log file ('/var/log/tuned/tuned.log') for details.

Confirma también el gobernador resultante:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort | uniq -c

Reinicia el servidor en una ventana de mantenimiento y repite estas comprobaciones para asegurarte de que el perfil se aplica al arrancar.

Solución de problemas

WARNING: cpupower not found for kernel X: falta el paquete de herramientas del kernel en ejecución. Instala linux-tools-$(uname -r); si acabas de actualizar el kernel, reinicia primero para que ambas versiones coincidan.

cpupower frequency-set -g schedutil falla: el controlador está en modo activo (intel_pstate o amd-pstate-epp) y solo admite performance y powersave. Es el comportamiento esperado; usa powersave con la EPP adecuada.

La frecuencia no pasa de la base aunque el turbo esté activo: revisa en la BIOS el perfil de energía del sistema. Muchos fabricantes tienen un modo "OS Control" o "Performance per Watt (OS)" que es necesario para que Linux gestione la frecuencia; con perfiles controlados por el firmware, los cambios del sistema operativo tienen efecto limitado.

Conclusión

Has identificado el controlador de frecuencia de tu servidor, comparado los gobernadores con datos reales de turbostat, ajustado la EPP, el turbo y los C-states, y dejado un perfil persistente con tuned. Para la mayoría de servidores, balanced o throughput-performance son suficientes; reserva latency-performance para servicios donde has medido que la latencia de despertar importa.

Como siguientes pasos, puedes combinar el perfil con la afinidad NUMA de tus servicios, ajustar los parámetros de red del kernel para tu servidor web o registrar el consumo de PkgWatt en tu sistema de monitorización para cuantificar el coste energético de cada perfil.