Gestion avancée de l'énergie du processeur

Les C-states sont des états de veille des coeurs du processeur. Le but de ce tutoriel est de voir une méthode pour gérer les C-states sur Linux. Cela est utile dans le cas où la gestion d'énergie du processeur est mal faite et provoque ainsi un gel aléatoire du système. Cela s'observe notamment sur les ordinateurs peu chers avec processeur Intel Bay Trail et quelques Intel Celeron qui sont basés sur les processeurs précédemment cités.

Si le noyau gère bien la gestion d'énergie du processeur et qu'il n'y a donc pas de gels, alors ne suivez pas ce tutoriel!

Il arrive que le BIOS contienne un paramètre "C-states control" pour activer/désactiver les C-states. Si l'option est disponible, désactiver les C-states via le BIOS permettra d'être sûr que c'est la cause des gels aléatoires. C'est donc la première chose à vérifier en cas de gels aléatoires.

La commande

cpupower idle-info

permet de lister les C-states compatibles avec le processeur.

Par exemple, sur un processeur Intel Core i5 4210U, voici les C-states:

CPUidle driver: intel_idle
CPUidle governor: menu
analyzing CPU 0:
 
Number of idle states: 9
Available idle states: POLL C1 C1E C3 C6 C7s C8 C9 C10
POLL:
Flags/Description: CPUIDLE CORE POLL IDLE
Latency: 0
Usage: 33293
Duration: 3698149
C1:
Flags/Description: MWAIT 0x00
Latency: 2
Usage: 10487775
Duration: 3916810744
C1E:
Flags/Description: MWAIT 0x01
Latency: 10
Usage: 11362373
Duration: 2533863708
C3:
Flags/Description: MWAIT 0x10
Latency: 33
Usage: 6611768
Duration: 2724211142
C6:
Flags/Description: MWAIT 0x20
Latency: 133
Usage: 1759894
Duration: 1052846310
C7s:
Flags/Description: MWAIT 0x32
Latency: 166
Usage: 4240156
Duration: 3148722366
C8:
Flags/Description: MWAIT 0x40
Latency: 300
Usage: 3673897
Duration: 4457909063
C9:
Flags/Description: MWAIT 0x50
Latency: 600
Usage: 2747610
Duration: 7647149692
C10:
Flags/Description: MWAIT 0x60
Latency: 2600
Usage: 635019
Duration: 11682828891

POLL correspond à un processeur totalement actif, et plus on avance dans les C-states, plus le processeur est partiellement en veille. On fait correspondre la valeur 0 à POLL, 1 au premier C-state, …

Il est contre-productif de chercher à n'être que sur POLL: le pc consommera plus d'énergie et il chauffera plus!

Afin de voir l'utilisation des C-states, on passe la commande

cpupower monitor

ce qui permet de déduire les C-states qui pourraient poser problème.

Afin de bloquer logiciellement les C-states, deux paramètres à passer à Grub sont importants ici:

  • intel_idle.max_cstate=N
  • processor.max_cstate=N

où N est à remplacer par le numéro au dernier C-state qui peut être utilisé. Le premier paramètre est souvent suffisant.
Si par exemple le 4ème C-state est mal géré par le noyau Linux et que les 3 premiers ne posent pas problème, alors on remplace N par 3 pour éviter les gels.

Si vraiment aucun C-state à part POLL est correctement géré, passer le paramètre intel_idle.max_cstate=0 ne suffira pas, passer en plus idle=poll permettra de n'utiliser que POLL, mais cela n'est pas recommandé!

En règle générale, sur des processeurs Intel Bay Trail, le paramètre intel_idle.max_cstate=1 suffit à empêcher les gels.

Il arrive que seul le Nième C-state pose problème. Dans ce cas, au lieu de se limiter aux N-1 C-states précédents, on peut chercher à désactiver logiciellement le C-state qui pose problème. Pour cela, on utilise la commande <code bash>sudo cpupower idle-set -d N<code> où N est à remplacer par le C-state qui pose problème. On peut aussi chercher à empêcher logiciellement d'utiliser un C-state sur un coeur en particulier avec le paramètre -c .

  • utilisateurs/naziel/gestion_energie_processeur.txt
  • Dernière modification: Le 03/01/2019, 23:03
  • par naziel