ACPI: el maldito y querido estándar de gestión y ahorro de energía

ACPI (Advanced Configuration and Power Interface) es el sustituto del antiguo APM. Un sistema que se ha transformado en un estándar y ha llegado más allá de los x86, para el que fue concebido por Intel. A pesar de su popularidad, no está libre de desventajas y críticas bastante duras.

En esta pequeña guía de introducción a ACPI aprenderás lo básico y esencial para saber de qué se trata, así como algunas de sus debilidades…

¿Qué es ACPI?

ACPI es un sistema de gestión de energía y ahorro. En este caso va más allá de APM, permitiendo detectar la pulsación del botón de apagado como un evento y haciendo que el sistema operativo pueda detectarlo para que no se corra riesgo como con APM (Advanced Power Management), asigna IRQs a dispositivos, permite una serie de funciones de ahorro/energía para que los diseñadores las puedan explotar en sus dispositivos, etc.

Intel, Microsoft y Toshiba crearon este sistema, lanzando la primera especificación a finales de 1996. Después de eso vendrían algunas nuevas revisiones para soportar 64-bit, multiprocesador, SATA, PCIe, USB 3.0, etc, hasta la última rev6.2.

Aunque en un inicio era para x86, poco a poco se ha ido extendiendo hacia otras arquitecturas. Por ejemplo, Olaf Johansson comenzó a escribir código para usarlo en ARM. Y el conocido Jon Masters aclaró en aquel momento, cuando surgieron muchas críticas, que ARM seguiría la ruta de ACPI y todos los granes apostarían por él les guste o no. Se refería al ámbito del HPC, donde ARM está usando muchos componentes del ecosistema x86 (GPUs, UEFI,…) por razones obvias…

Críticas

ACPI ha recibido muchas críticas de grandes voces de la industria. De hecho, muchos han tenido que prescindir de él para corregir algunos problemas. Entre las críticas están las del fundador de Canonical, Mark Shuttleworth, que lo comparó con un troyano, al ser firmware propietario con los riegos para la seguridad que ello supone.

Mark llegó a decir que «el firmware en tu dispositivo es el mejor amigo de la NSA. […] Un caballo de Troya de proporciones monumentales. […] El mayor error es asumir que la NSA es la única institución que abusa de esta posición de confianza; de hecho, es razonable suponer que todo firmware es un pozo negro de inseguridad, cortesía de la incompetencia de más alto grado de los fabricantes y la competencia de más alto grado de tales agencias.«. Entonces pidió que se abriese ACPI.

Por otro lado, algunos como Lenovo, Samsung, etc., también fueron destapados usando la tabla ACPI WPBT de Windows para instalar software dudoso, y otros podrían también usarlo para rootkits, etc.

Guía de introducción a ACPI

ACPI cubre a multitud de dispositivos de hardware, como la CPU, GPU, RAM, y otros dispositivos. A todos ellos los dota de una serie de mecanismos para que puedan ahorrar energía o gestionar distintos estados energéticos. Para ello, los fabricantes de hardware implementan tecnologías capaces de soportar las funciones de ACPI y trabajar con ellas.

Por ejemplo, si recuerdas el artículo sobre el marketing engañoso, te mostré algunas marcas registradas de Intel y AMD que no son más que implementaciones para poder hacer uso de los estados energéticos de ACPI. Por ejemplo, AMD PowerNow!, Intel SpeedStep, etc. Éstas, por ejemplo, usan los estados C de ACPI para operar y ahorrar energía.

Con ello, una CPU podría ahorrar energía de un subsistema, como puede ser apagar un núcleo, la cache, desactivar el reloj, realizar un apagado completo, etc. También puede disminuir el voltaje, la frecuencia (recuerda que la potencia es P f · V²), etc. Es decir, usar controladores dinámicos.

También te recomiendo leer el artículo sobre electromigración donde hablé también sobre el TDP y otros términos que deberías tener claros. Ya que deberás entender cuál es la potencia máxima de una CPU, y los límites de potencia que puede mantener en ciertas ocasiones (PL1, PL2, PL3, PL4), ya que el TDP se mide en el peor de los casos cuando todos los núcleos están activos y trabajando en la frecuencia base. Pero eso no siempre es así en el mundo real.

Estados de energía

Son los estados que puede controlar el usuario durante el uso normal de un equipo.

Global States (G States)

Dentro de los estados globales tienes:

  • G0/S0: la computadora está trabajando (working).
  • G1: durmiendo (sleeping):
    • G1/S1: encendido-suspendido. Se conserva el estado del sistema, manteniendo la CPU y memoria cache.
    • G1/S2: CPU apagada. Se pierden los datos.
    • G1/S3: standby, sleep, o suspendido. La RAM del sistema permanece alimentada para que no se pierdan los datos.
    • G1/S4: hibernación o suspensión de disco. Todo se almacena en la memoria no volátil o secundaria. Así se libera a la RAM para apagarla también y que no se pierdan los datos.
  • G2/S5: soft-off, apagado suave. Se produce un apagado del equipo, pero se mantiene un mínimo de alimentación para que un evento pueda arrancar.
  • G3: apagado duro. Se desconecta la fuente de alimentación mediante el interruptor físico. Solo funcionarán cosas como el RTC que está alimentado por pila.

Todos estos estados estarán asociados también a estados C, en algunos casos…

Device States (D States)

Dentro de estos estados de energía también están los estados de dispositivos:

  • D0: fully on, completamente encendido. Está operativo.
  • D1 y D2: estados intermedios que pueden variar de un dispositivo a otro.
  • D3: se divide en caliente y frío, con alimentación auxiliar o sin ella respectivamente (no responde al bus).

Processor States (C States)

Los estados del procesador son otros modos energéticos para ahorrar energía en la CPU. Tiene varias formas de entrar en los modos, como usando instrucciones HLT (halt) o MWAIT (junto con registros como EAX para indicar el estado Cx). Instrucciones privilegiadas que no pueden ser ejecutadas por el espacio de usuario, pero sí por el espacio kernel.

En cuanto a los estados disponibles en ACPI son:

  • C0: estado operativo.
  • C1/C1E: halt, cuando el procesador no está procesando instrucciones, pero puede regresar a un estado de ejecución de forma instantánea. Los modernos procesadores tienen C1E (Enhanced Halt State) para reducir aún más el consumo.
  • C2: Stop-clock, mantiene el estado de forma similar al C1, pero puede tardar más en regresar a su estado activo al haber detenido el reloj.
  • C3: existen variantes como Sleep, Deep Sleep o Deeper Sleep. Un estado en el que la cache L1 y L2 se vacían en la LLC, y todos los relojes centrales se apagan. Solo se mantiene el núcleo encendido para mantener su estado.
  • C4-C10: otros modernos procesadores han integrado más estados para ahorros mayores. Por ejemplo, el C6 apagará el núcleo también y guarda el estado en una SRAM dedicada para que el voltaje del core sea 0v. Cuando se sale de C6 se puede restablecer el estado desde la SRAM.

Se podrían desactivar los estados Cx y solo dejar un C0 permanente, pero no sería fiable. Además, debes saber que cuando se activa una interrupción, el núcleo afectado se debe activar y colocar en estado C0. Aunque algunos procesadores modernos tienen funciones para mejorar el ahorro que pueden enrutar la interrupción hacia un núcleo que ya está activo para no despertar a uno inactivo. Eso no solo es un ahorro energético, también mejora el rendimiento, ya que es más rápido trabajar sobre uno activo que encender uno inactivo.

Performance States (P States)

Por último, los estados P afectan al núcleo de la CPU. Con ellos se puede alterar la frecuencia y el voltaje del núcleo para ahorrar energía. Pueden ser controlados por gobernadores del propio sistema operativo, o por hardware (el SO es consciente, especifica la carga de trabajo en el momento y el hardware seleccionará un estado adecuado). Son aquellos que corresponden a tecnologías como Intel SpeedStep, AMD PowerNow!, PowerSaver de VIA, etc.

Por ejemplo, en Linux tienes IA32_PM_ENABLE y unos 39 niveles. Siendo 1 el nivel de rendimiento más bajo.

La conmutación entre estos estados P es muy rápida, pudiendo realizar varias en un solo segundo.

Debes tener en cuenta los modos Turbo y similares actuales. Cuando el consumo de energía está por debajo del TDP, y bajo ciertas condiciones, la frecuencia de la CPU se puede aumentar más allá de la frecuencia base durante un tiempo. Eso es así ya que dadas las circunstancias no aumentarán la potencia más allá del TDP. Todo esto alterará también el uso de los estados P.

En cuanto a los estados P, tienes:

  • P0: máximo voltaje y frecuencia.
  • P1: se escala la frecuencia y voltaje a valores ligeramente por debajo de P0.
  • P2: menor frecuencia y voltaje que P1.
  • Pn: menos…

Ejemplo con Linux

En en kernel Linux, tienes varias formas de trabajar o comprobar estos estados de energía. Debes tener en cuenta que los subsistemas no serán iguales para todas las plataformas. Por ejemplo, para x86 y otras de alto rendimiento se usan los módulos de controladores cpufreq y cpuidle. En cambio, para dispositivos móviles (Android), ARM ha estado también apoyando EAS (Energy-Aware Scheduling).

Existe una utilidad muy práctica llamada CoreFreq para Linux que puedes usar también. También puedes usar el comando cpupower frequency-info. También tienes paquete del cliente acpitool, para usar la herramienta acpi, etc.

Puedes ver el gobernador que afecta ahora a un núcleo de tu CPU de una forma sencilla (ya veremos más cuando llegue al tema de gestión de hardware de la serie LPIC). Para ello, puedes ir a:

#Siendo cpu* el número de CPU en caso de que sea multicore o MP. 
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

Ese comando te mostrará el gobernador que está controlando el estado del núcleo, pudiendo ser:

  • cpufreq_performance: trabaja al máximo rendimiento.
  • cpufreq_powersave: trabaja a la mínima frecuencia posible para ahorrar.
  • cpufreq_ondemand: cambio dinámico, forzando frecuencias máximas o mínimas, según las necesidades en cada momento.
  • cpufreq_userspace: permite a los programas cambiar la frecuencia.
  • cpufreq_conservative: similar a ondemand, pero lo hace de forma menos brusca. Un escalado de frecuencia más progresivo.

Podrías forzar a usar un gobernador si lo quieres. Puedes usar el comando cpupower.

Ten en cuenta que si tienes una CPU con SMT, cada thread simultáneo que pueda desarrollar se verá como un núcleo lógico independiente. Es decir, si tienes un procesador de cuatro núcleos con SMT2, entonces aparecerá de cpu0 a cpu7 (8 núcleos lógicos).

En el directorio /sys/devices/system/cpu/cpu# también encontrarás otros ficheros interesantes, como:

  • affected_cpus: procesadores afectados por los cambios de frecuencia.
  • cpuinfo_cur_freq: frecuencia operativa actual.
  • scaling_cur_freq: escalamiento actual.
  • scaling_available_governors: los gobernadores disponibles.
  • cpuinfo_max_freq: frecuencia máxima.
  • cpuinfo_min_freq: frecuencia mínima.
  • scaling_available_frequencies: todas las frecuencias disponibles para elegir.
  • scaling_driver: el driver o controlador que está actuando. Puede ser speedstep-smi para Intel, powernor_k8 y powernow_k7,… para AMD, p4-clockmod, longhaul, etc.

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

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

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar