Cet article présente brièvement des technologies de gestion de l’énergie qui sont disponibles sur les processeurs x86_64 de marque Intel et AMD, ainsi que les paramètres du BIOS qui permettent leur activation. Différentes possibilités sous Linux (ici avec les paquets Debian 9) sont présentées pour gérer la consommation énergétique et piloter la cadence du processeur. Les informations qui suivent ne sont malheureusement pas exhaustives, et n’hésitez pas à me contacter si vous détectez des raccourcis hâtifs ou même des erreurs, n’étant pas un expert du sujet.

L’ACPI et les paramètres du BIOS

ACPI est une interface unifiée sur les ordinateurs de bureau et les serveurs, permettant de connaître et de modifier les méthodes de gestion de l’énergie. Le but de cette norme est de réduire la consommation énergétique en utilisant par exemple des modes de veille par périphérique ou sur l’ordinateur entier.

Les C-states, ou idle states

On voit souvent passer de références aux C-states dans le BIOS ou sur internet (exemple : C0, C3, C6, …). La signification du « C » n’apparait pas toujours clairement sur internet, il s’agit de Core, soit des états de veille ou de fonctionnement par cœur de processeur. Voici à quoi correspondent certains d’entre eux :

  • C0 : processeur allumé (sans économie d’énergie)
  • C1 : processeur à l’arrêt mais prêt à repartir avec son interface en fonction
  • C3 : processeur en veille (cache vidé)
  • C6 : processeur en veille profonde

D’autres C-states sont documentés sur cette page de hardwaresecrets.com. Encore mieux, je vous conseille le diagramme de la page 15 de ce PDF. Le BIOS donne souvent accès à un réglage permettant de communiquer à l’OS l’état des C-states ou non. Sous Linux, cela semble préférable, afin que ces informations remontent au noyau.

En termes de latence, tous les C-states ne sont pas égaux : par exemple le C6 est réputé pour être long à modifier. Pour plus d’informations, lire cet article et ce dossier ainsi que la suite de cet article qui indique la latence par C-state sur votre plateforme.

Je pense que les C-states doivent être activés sur la plupart des ordinateurs. Certains cas de figure particuliers justifient peut-être leur désactivation dans le BIOS sur les C-states supérieurs à zéro : performance ultime (HPC), latence minimale (virtualisation, serveur web, …), volonté de transformer l’ordinateur en radiateur d’appoint (pourquoi pas). Je me demande par exemple si l’activation des C-states sur un hyperviseur ne serait pas de nature à défavoriser les VM (steal ou irq time).

Les C-states évoluent souvent en cours de fonctionnement, ce n’est pas uniquement lors d’extinctions physique de la machine.

Les P-states : SpeedStep, Turbo Boost et compagnie

La signification du « P » dans P-states est difficile à trouver, ce serait pour package. Contrairement aux C-states qui sont principalement des états de veille, les P-states décrivent des états de fonctionnement du cœur de processeur. Plus précisément, il s’agit de couples voltage-fréquence qui sont possibles pour le processeur, et qui influent sur sa consommation énergétique en fonctionnement, ainsi que sur ses performances.

Les technologies Intel SpeedStep et AMD Cool’n’Quiet correspondent techniquement aux P-states. Elles permettent de réduire la fréquence nominale d’un ou de plusieurs cœurs de processeur. C’est une sorte d’underclocking automatisé. Ce sont des mots clés que l’on retrouve communément dans les BIOS et qu’il faut activer pour en tirer parti. Cette technologie possède un intérêt pour tous les types d’ordinateurs, du mobile pour prolonger la batterie, au PC de bureau pour les économies d’énergie, en passant par le serveur qui coûte aussi cher à alimenter en électricité qu’à refroidir avec le système de climatisation.

Plus récent, on trouve le Intel Turbo Boost et le AMD Turbo Core qui correspondent également aux P-states. Cela permet d’augmenter la fréquence d’un nombre limité de cœurs de processeurs (exemple 2 ou 4 sur un total de 8) au-delà de la fréquence nominale, dans le but d’améliorer les performances des processus monothreadés. C’est une sorte d’overclocking automatisé. Pour ne pas faire surchauffer le processeur, on ne peut généralement pas surcadencer l’ensemble des cœurs du processeur en même temps.

Les P-states étant comparables à des états d’underclocking ou overclocking, on ne sera pas étonné de constater par la suite qu’ils modifient le coefficient multiplicateur par cœur de processeur, ainsi que la tension Vcore.

Les C-states sous Linux

Afficher les C-states en cours de fonctionnement

Le programme i7z (paquet i7z) permet de montrer le temps processeur pour chaque C-state (C0, C1, C3, C6). C’est un outil complet mais compatible avec les processeurs Intel uniquement.

Le programme i7z en fonctionnement

Le programme i7z en fonctionnement sur une machine de 2 sockets et 12 cœurs

En équivalent de i7z, mais compatible avec les processeurs AMD également, on trouve le programme cpupower (paquet linux-cpupower) avec l’option monitor.

Ces deux sorties écrans sont comparables, elles affichent le temps passé pour chaque cœur dans les différents C-states. Pour plus d’information sur la signification de chaque colonne, consulter le manuel Linux.

Afficher les C-states compatibles

Pour afficher les C-states pris en charge par le processeur, le programme cpupower s’utilise avec l’option idle-info. Ici on trouve POLL (état de fonctionnement à latence nulle), C1 (latence 3µs), C1E (latence 10µs), C3 (latence 20µs), C6 (latence 200µs).

Modifier les C-states

Il existe plusieurs leviers pour modifier les C-states :

  • Les BIOS comportent généralement une option pour désactiver tout ou partie des C-states
  • Le paramètre de boot du noyau Linux processor.max_cstate=1 idle=poll  désactive logiciellement les C-states supérieurs à 0 (source).
  • On peut manipuler le fichier /dev/cpu_dma_latency  pour configurer finement la latence maximale tolérée (même source).
  • Le programme cpupower (option idle-set) permet en théorie de stipuler quels C-states sont autorisés par cœur, dans un but de gestion de l’énergie et de contrôle de la latence.

Dans 99% des cas, je pense qu’il n’y a pas d’intérêt de chercher à modifier le comportement par défaut des C-states, puisque le noyau se débrouille à merveille. A la limite, mieux vaut indiquer à l’OS quels C-states interdire plutôt que de tout désactiver dans le BIOS. De plus, la technologie Hyper Threading ne fonctionne apparemment qu’avec les C-states activés (cf. PDF de Dell dans la bibliographie). Donc prudence sur ce terrain.

Les P-states sous Linux

Afficher les P-states en cours de fonctionnement

Pour afficher la fréquence des cœurs de processeur en temps réel, la commande i7z affichée ci-dessus est appropriée.

Le programme turbostat (paquet linux-cpupower) affiche également la fréquence du processeur de manière plus concise.

Attention, le contenu du fichier /proc/cpuinfo met bien en évidence les paliers SpeedStep, mais masque complètement les modes Turbo Boost pourtant bien réels.

Lister les P-states compatibles

Le programme cpupower et son option frequency-info permet de lister les fréquences supportées par le processeur (modes SteedStep et Turbo Boost). Ci-dessous on peut lire que les modes SpeedStep supportés sont 2,13 Ghz, 2 Ghz, 1,86 Ghz, 1,73 Ghz, 1,6 Ghz. Les modes Turbo Boost supportés sont 2,53 Ghz (sur 4 cœurs max) et 2,66 Ghz (sur 2 cœurs max)

Le programme cpufreq-info (paquet cpufrequtils) affiche sensiblement la même chose.

Modifier les P-states

Via le gouverneur de l’OS

Ce même programme cpupower peut modifier les fréquences des processeurs via son option frequency-set. Plutôt que de modifier manuellement la fréquence de chaque cœur (fastidieux et peu utile) on fait appel aux gouverneurs de l’OS qui sont des modes de gestion. Voici ci-après comment afficher simplement les gouverneurs possibles (également appelés governors, tactiques, régulateurs).

On utilisera par exemple powersave pour minimiser la conso énergétique en réduisant la fréquence au minimum sur tous les coeurs, et performance pour augmenter au maximum la fréquence de tous les coeurs. Le gouverneur ondemand est particulièrement intéressant pour 99% des cas de figure : le noyau adapte les P-states en fonction de la charge. Il peut même être plus performant que le mode performance car il permet le déclenchement du Turbo Boost qui, rappelons-le, ne peut fonctionner que sur quelques cœurs en même temps tout en réduisant la fréquence des autres cœurs.

Exemple de modification du gouverneur :

Désactivation totale

Le paramètre de boot du noyau  intel_pstate=disable  permet de désactiver l’implémentation Intel des P-states. Le processeur sera alors cadencé à sa vitesse nominale sans modification. C’est une opération radicale.

Conclusion

La compréhension des mécanismes matériels et logiciels d’économie d’énergie est très intéressante. Attention cependant à ne pas rentrer dans la course au tuning : dans 99% des cas le noyau gère très bien les choses sans intervention utilisateur ! A mon avis leur désactivation totale ne doit être décidée qu’en dernier recours (instabilité, problème de performances, …).

Je vous conseille donc d’activer les C-states et P-states, ainsi que de de rester en gouverneur ondemand. Vous pouvez vérifier que les choses se passent bien en stressant 1 à n processeurs avec la commande stress-ng -c1  par exemple. Pour un petit nombre de threads, les fréquences Turbo Boost seront déclenchées, et pour un nombre de thread supérieur ou égal au nombre de cœurs, la fréquence nominale sera retenue sur tous les cœurs.

Bibliographie