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.
Pré-requis
- Disposer des droits d'administration.
- installer l'outil cpupower en installant linux-tools-common linux-tools-generic
Bloquer les C-states via le BIOS
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.
Gestion simple des C-states
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, …
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é!
Gestion avancée des C-states
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
sudo cpupower idle-set -d N
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 .
Voir aussi
- Un fil traitant du sujet sur le forum ubuntu-fr
Contributeurs principaux : Naziel
Basé sur « Processeurs sous Linux : gestion de l’énergie et contrôle de la fréquence » par Paul Chevalier .