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.
En équivalent de i7z, mais compatible avec les processeurs AMD également, on trouve le programme cpupower (paquet linux-cpupower) avec l’option monitor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
root@ordinateur:~# cpupower monitor |Nehalem || Mperf || Idle_Stats PKG |CORE|CPU | C3 | C6 | PC3 | PC6 || C0 | Cx | Freq || POLL | C1-N | C1E- | C3-N | C6-N 0| 0| 0| 2,55| 94,01| 0,00| 0,00|| 1,79| 98,21| 1614|| 0,00| 0,02| 0,22| 2,71| 95,40 0| 1| 2| 0,55| 97,62| 0,00| 0,00|| 0,93| 99,07| 1616|| 0,00| 0,00| 0,00| 0,62| 98,53 0| 2| 4| 0,00| 98,16| 0,00| 0,00|| 0,84| 99,16| 1600|| 0,00| 0,00| 0,02| 0,00| 99,23 0| 8| 6| 0,80| 96,65| 0,00| 0,00|| 1,38| 98,62| 1635|| 0,00| 0,00| 0,00| 0,85| 97,88 0| 9| 8| 1,17| 88,89| 0,00| 0,00|| 8,63| 91,37| 1604|| 0,00| 0,00| 0,00| 1,16| 90,28 0| 10| 10| 0,65| 96,24| 0,00| 0,00|| 2,04| 97,96| 1621|| 0,00| 0,00| 0,00| 0,69| 97,36 1| 0| 1| 0,00| 0,00| 0,00| 0,00|| 99,89| 0,11| 2665|| 0,00| 0,00| 0,00| 0,00| 0,00 1| 1| 3| 0,00| 99,66| 0,00| 0,00|| 0,16| 99,84| 2639|| 0,00| 0,00| 0,00| 0,00| 99,86 1| 2| 5| 0,00| 99,37| 0,00| 0,00|| 0,33| 99,67| 2648|| 0,00| 0,00| 0,00| 0,00| 99,68 1| 8| 7| 0,00| 99,98| 0,00| 0,00|| 0,01| 99,99| 2665|| 0,00| 0,00| 0,00| 0,00| 100,0 1| 9| 9| 0,00| 98,80| 0,00| 0,00|| 0,77| 99,23| 2614|| 0,00| 0,00| 0,00| 0,00| 99,24 1| 10| 11| 0,00| 99,97| 0,00| 0,00|| 0,01| 99,99| 2666|| 0,00| 0,00| 0,00| 0,00|100,00 |
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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
root@ordinateur:~# cpupower idle-info CPUidle driver: intel_idle CPUidle governor: menu analyse du CPU 0 : Number of idle states: 5 Available idle states: POLL C1-NHM C1E-NHM C3-NHM C6-NHM POLL: Flags/Description: CPUIDLE CORE POLL IDLE Latency: 0 Usage: 8052 Duration: 8993496 C1-NHM: Flags/Description: MWAIT 0x00 Latency: 3 Usage: 520271 Duration: 68110490 C1E-NHM: Flags/Description: MWAIT 0x01 Latency: 10 Usage: 296248 Duration: 114866696 C3-NHM: Flags/Description: MWAIT 0x10 Latency: 20 Usage: 1606611 Duration: 884003063 C6-NHM: Flags/Description: MWAIT 0x20 Latency: 200 Usage: 3502682 Duration: 14857949147 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
root@ordinateur:~# turbostat CPU Avg_MHz Busy% Bzy_MHz TSC_MHz - 284 13.03 2177 2137 0 194 10.69 1807 2140 2 62 3.72 1664 2140 4 72 4.22 1701 2140 6 84 4.97 1685 2140 8 118 6.90 1703 2140 10 86 5.02 1708 2140 1 99 4.41 2240 2135 3 1894 79.24 2389 2135 5 542 25.43 2132 2133 7 83 3.83 2170 2133 9 94 4.35 2157 2133 11 82 3.70 2225 2133 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@ordinateur:~# cpupower frequency-info analyse du CPU 0 : driver: acpi-cpufreq CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 10.0 us limitation matérielle : 1.60 GHz - 2.13 GHz available frequency steps: 2.13 GHz, 2.13 GHz, 2.00 GHz, 1.86 GHz, 1.73 GHz, 1.60 GHz régulateurs disponibles : powersave userspace conservative ondemand performance schedutil tactique actuelle : la fréquence doit être comprise entre 1.60 GHz et 2.13 GHz. Le régulateur "ondemand" est libre de choisir la vitesse dans cette plage de fréquences. current CPU frequency: 1.60 GHz (asserted by call to hardware) boost state support: Supported: yes Active: yes 2533 MHz max turbo 4 active cores 2533 MHz max turbo 3 active cores 2667 MHz max turbo 2 active cores 2667 MHz max turbo 1 active cores |
Le programme cpufreq-info (paquet cpufrequtils) affiche sensiblement la même chose.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
root@ordinateur:~# cpufreq-info cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009 Veuillez rapportez les erreurs et les bogues à cpufreq@vger.kernel.org, s'il vous plait. analyse du CPU 0 : pilote : acpi-cpufreq CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 10.0 us. limitation matérielle : 1.60 GHz - 2.13 GHz plage de fréquence : 2.13 GHz, 2.13 GHz, 2.00 GHz, 1.86 GHz, 1.73 GHz, 1.60 GHz régulateurs disponibles : powersave, userspace, conservative, ondemand, performance, schedutil tactique actuelle : la fréquence doit être comprise entre 1.60 GHz et 2.13 GHz. Le régulateur "ondemand" est libre de choisir la vitesse dans cette plage de fréquences. la fréquence actuelle de ce CPU est 2.13 GHz (vérifié par un appel direct du matériel). des statistique concernant cpufreq:2.13 GHz:2,35%, 2.13 GHz:0,27%, 2.00 GHz:0,70%, 1.86 GHz:1,90%, 1.73 GHz:5,15%, 1.60 GHz:89,63% (122756) [...] |
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).
1 2 3 |
root@ordinateur:~# cpupower frequency-info -g analyse du CPU 0 : régulateurs disponibles : powersave userspace conservative ondemand performance schedutil |
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 :
1 2 3 4 |
root@ordinateur:~# cpupower frequency-set -g powersave Setting cpu: 0 Setting cpu: 1 [...] |
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
- CPU performance states (P-states) and CPU operating states (C-states), ibm.com
- Balancing Power and Performance in the Linux Kernel, linuxfoundation.org
- Intel P-State driver, kernel.org
- C-states and P-states are very different, software.intel.com
- (update) C-states, C-states and even more C-states, software.intel.com
- Energy -Efficient Platforms – Considerations for Application Software and Services, intel.com
- Controlling Processor C-State Usage in Linux, en.community.dell.com
- Wake-up Latencies for Processor Idle States on Current x86 Processors, http://ena-hpc.org
- Are hardware power management features causing latency spikes in my application?, access.redhat.com