thermald est un dispositif de protection contre la surchauffe, tout particulièrement adapté aux processeurs intel. Il s'appuie pour cela sur les modules :
intel_rapl - Runing Average Power Limit - Mesure de la puissance consommée par le processeur
intel_powerclamp - Injections d'états inactifs - C-states
intel_pstate - Pilote des états opérationnels - P-states
cpufreq_xxxxxx - Pilotes de régulateur de fréquence (powersave ou performance)
thermald arrive avec une configuration par défaut directement utilisable.
Les modules intel_rapl, intel_powerclamp, intel_pstate et cpufreq_performance sont automatiquement chargés par le noyau lorsqu'un processeur intel récent est détecté : voir : Pilotage processeur. Pour mémoire, cpufreq_performance est le régulateur par défaut associé à intel_pstate. Pour utiliser le régulateur intel_powersave, un gestionnaire de chargement tel que cpufreqd est nécessaire,
Pour savoir si le module intel_pstate est utilisé :
$ cpupower frequency-info -d
analyse du CPU 0 :
driver: intel_pstate
Par défaut le "turbo" est activé
$ cat /sys/devices/system/cpu/intel_pstate/no_turbo
0
Sinon, il est possible de l'activer :
$ echo 0 >/sys/devices/system/cpu/intel_pstate/no_turbo
Vérification de la présence du module intel_rapl
$ lsmod |grep intel_rapl
intel_rapl 20480 0
$ cat /sys/devices/virtual/powercap/intel-rapl/enabled
1
Détection de la présence du module intel_powerclamp
$ lsmod |grep intel_powerclamp
intel_powerclamp 16384 0
Identifier dans sysfs le répertoire associé (ici /sys/class/thermal/cooling_device4/ ):
$ grep -n intel_powerclamp /sys/class/thermal/cooling_device*/type
/sys/class/thermal/cooling_device4/type:1:intel_powerclamp
Par défaut, l'injection d'états inactifs n'est pas activée : cur_state doit-être positionnée à -1
$ cat /sys/class/thermal/cooling_device4/cur_state
-1
Détection du régulateur :
Cas du régulateur cpufreq_performance :
$ cpupower frequency-info -p
analyse du CPU 0 :
tactique actuelle : la fréquence doit être comprise entre 1.24 GHz et 3.10 GHz.
Le régulateur "performance" est libre de choisir la vitesse
dans cette plage de fréquences.Ccas du régulateur cpufreq_powersave :
Cas du régulateur cpufreq_powersave :
$ cpupower frequency-info -p
analyse du CPU 0 :
tactique actuelle : la fréquence doit être comprise entre 1.24 GHz et 3.10 GHz.
Le régulateur "powersave" est libre de choisir la vitesse
dans cette plage de fréquences.
L'installation de thermald s'effectue à partir des dépôts :
# aptitude install thermald
thermald est immédiatement pris en charge et activé par systemctl. Son activité peut-être contrôlée (arrêt, marche, statut, ..) par le service sytemctl correspondant.
$ systemctl status thermald.service
● thermald.service - Thermal Daemon Service
Loaded: loaded (/lib/systemd/system/thermald.service; enabled)
Active: active (running) since ven. 2016-09-09 10:11:45 CEST; 1h 34min ago
Main PID: 690 (thermald)
CGroup: /system.slice/thermald.service
└─690 /usr/sbin/thermald --no-daemon --dbus-enable
thermald peut également être lancé en mode debug ou info
# systemctl stop thermald
# thermald --no-daemon --loglevel=info (ou debug)
Le fichier de configuration personnalisable est en /etc/thermald/thermald-conf.xml. Il est possible de définir
les zones thermiques à surveiller
les capteurs associés et les limites, les types de régulation (max, etc...)
les dispositifs de refroidissement à utiliser
Un exemple de fichier de configuration est donné en Annexe 2 : l'objectif est de ne pas dépasser 70°C en continu. Les principaux écarts par rapport au fichier de configuration par défaut sont :
Température de seuil passée de 55°C à 70°C
Gestion du seuil passée de "passive" à "max"
Mise en parallèle de tous les processus (SEQUENTIAL remplacé par PARALLEL)
Rajout (pour mémoire?) des dispositifs de refroidissement intel_pstate et cpufreq
Pour comparer le fonctionnement, avec et sans thermald, et l'influence des paramètres du fichier de configuration, une charge processeur importante est générée en utilisant ffmpeg et la conversion d'un film d'un format à un autre :
$ ffmpeg -i big_buck_bunny_1080p_stereo.avi tmp.mp4
Le film est disponible sur le site https://download.blender.org/peach/bigbuckbunny_movies/
Les essais ont été effectués avec un PC Asus N55SL
Les charges processeur, actives (C0) et inactives (Cx), et les fréquences des processeurs sont fournis par cpupower monitor
La température du processeur et la vitesse du ventilateur sont enregistrés, ainsi que pour information, la charge processeur telle que mesurée par psensor (qui inclue les états pstate et n'indique donc pas la charge effective opérationnelle C0).
Sans thermald, le taux d'occupation processeur (état actif C0) monte à 100%, avec une fréquence proche du maximum autorisé par le régulateur (powersave ou performance). La température du processeur monte très rapidement, et dépasse la température maximum (86°C), température à laquelle l'essai a été interrompu (température maximale processeur telle que définie dans hwmon ) :
cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_label
Physical id 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_max
86000
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_crit
100000
Avec thermald et la configuration thermald-conf.xml par défaut
Avec le régulateur performance, on constate des réductions marginales du taux d'occupation processeur, la fréquence est légèrement réduite, et la température du processeur se stabilise vers 86°C.
Avec le régulateur powersave, la charge processeur n'est pas réduite non plus, par contre, la fréquence processeur est réduite jusqu'au minimum défini dans le régulateur, la température se stabilise vers 54°C
Avec thermald et une configuration modifiée (voir Annexe - Configuration thermald 70°C max) ,
on constate, que la charge et la fréquence s'adaptent de façon à ce que la température du processeur ne dépasse pas en régime établi 70°C. Dans dmesg, apparaissent des messages indiquant l'injection d'états d'inaction :
$ dmesg |grep intel_powerclamp
[ 2935.601841] intel_powerclamp: Start idle injection to reduce power
Lorsque thermald n'est pas actif :
Lorsque la charge processeur est faible (C0 petit), l'état inactif "profond" C7 est majoritaire et tend vers 100% (100-C0). Lors d'une demande ponctuelle, la fréquence peut atteindre la fréquence maximale autorisée par le gouverneur (powersave ou performance) .
# cpupower monitor
|Nehalem || SandyBridge || Mperf || Idle_Stats
CPU | C3 | C6 | PC3 | PC6 || C7 | PC2 | PC7 || C0 | Cx | Freq || POLL | C1-S | C1E- | C3-S | C6-S | C7-S
0| 0,12| 0,00| 0,06| 5,67|| 96,22| 4,04| 74,76|| 1,25| 98,75| 2669|| 0,00| 0,97| 0,00| 0,12| 0,00| 97,62
2| 0,12| 0,00| 0,06| 5,67|| 96,22| 4,04| 74,76|| 0,57| 99,43| 2043|| 0,00| 0,00| 0,44| 0,07| 0,00| 98,90
1| 0,23| 0,00| 0,06| 5,67|| 89,36| 4,04| 74,76|| 3,85| 96,15| 2100|| 0,00| 0,58| 0,67| 0,60| 0,00| 94,27
3| 0,23| 0,00| 0,06| 5,67|| 89,36| 4,04| 74,76|| 2,90| 97,10| 2514|| 0,00| 1,60| 1,24| 0,07| 0,01| 94,14
Lorsque la charge augmente, C0 tend vers 100% et Cx vers 0. La fréquence tend vers la fréquence maximale autorisée par le régulateur.
# cpupower monitor
|Nehalem || SandyBridge || Mperf || Idle_Stats
CPU | C3 | C6 | PC3 | PC6 || C7 | PC2 | PC7 || C0 | Cx | Freq || POLL | C1-S | C1E- | C3-S | C6-S | C7-S
0| 0,00| 0,00| 0,00| 0,00|| 0,00| 0,00| 0,00|| 99,98| 0,02| 2881|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,00
2| 0,00| 0,00| 0,00| 0,00|| 0,00| 0,00| 0,00|| 98,89| 1,11| 2881|| 0,00| 0,00| 0,00| 0,00| 0,00| 1,10
1| 0,00| 0,00| 0,00| 0,00|| 0,00| 0,00| 0,00|| 99,67| 0,33| 2881|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,31
3| 0,00| 0,00| 0,00| 0,00|| 0,00| 0,00| 0,00|| 99,37| 0,63| 2881|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,62
Si une charge forte est appliquée de façon constante, la température du processeur monte très rapidement et peut dépasser la température maximale prévue du processeur.
Lorsque le régulateur performance est en fonction :
on ne constate pas de réduction significative de la charge processeur ni de la fréquence, et la température se stabilise à une température élevée (aux environs de 86°C), bien supérieure au seuil prévu dans le fichier de configuration.
cpupower monitor -m Mperf
|Mperf
CPU | C0 | Cx | Freq
0| 98,37| 1,63| 2527
2| 98,68| 1,32| 2527
1| 99,49| 0,51| 2527
3| 98,57| 1,43| 2527
Lorsque le régulateur powersave est en fonction :
La charge processeur ne diminue pas, par contre, la fréquence diminue jusqu'à approcher le minimum matériel, et la température se stabilise aux environs de 54°C, inférieure au seuil défini dans la configuration.
# cpupower monitor -m Mperf
|Mperf
CPU | C0 | Cx | Freq
0| 99,09| 0,91| 798
2| 99,24| 0,76| 798
1| 99,93| 0,07| 798
3| 99,99| 0,01| 798
Lorsque le régulateur powersave est en fonction
# cpupower monitor
7 |Nehalem || SandyBridge || Mperf || Idle_Stats
CPU | C3 | C6 | PC3 | PC6 || C7 | PC2 | PC7 || C0 | Cx | Freq || POLL | C1-S | C1E- | C3-S | C6-S | C7-S
0| 0,00| 0,00| 0,00| 4,36|| 25,50| 2,54| 6,35|| 73,53| 26,47| 2052|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,11
2| 0,00| 0,00| 0,00| 4,36|| 25,50| 2,54| 6,35|| 64,62| 35,38| 2033|| 0,00| 0,00| 0,00| 0,00| 0,00| 4,26
1| 0,00| 0,00| 0,00| 4,36|| 27,02| 2,54| 6,35|| 68,80| 31,20| 2010|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,31
3| 0,00| 0,00| 0,00| 4,36|| 27,02| 2,54| 6,35|| 71,25| 28,75| 2045|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,00
Lorsque le régulateur performance est en fonction
# cpupower monitor
|Nehalem || SandyBridge || Mperf || Idle_Stats
CPU | C3 | C6 | PC3 | PC6 || C7 | PC2 | PC7 || C0 | Cx | Freq || POLL | C1-S | C1E- | C3-S | C6-S | C7-S
0| 0,00| 0,00| 0,00| 6,05|| 47,43| 3,60| 26,72|| 49,16| 50,84| 2871|| 0,00| 0,00| 0,07| 0,00| 0,00| 2,12
2| 0,00| 0,00| 0,00| 6,05|| 47,43| 3,60| 26,72|| 49,91| 50,09| 2859|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,25
1| 0,00| 0,00| 0,00| 6,05|| 47,87| 3,60| 26,72|| 49,61| 50,39| 2866|| 0,00| 0,00| 0,00| 0,00| 0,00| 0,36
3| 0,00| 0,00| 0,00| 6,05|| 47,87| 3,60| 26,72|| 49,49| 50,51| 2872|| 0,00| 0,00| 0,38| 0,38| 0,00| 0,87
$ cat /etc/thermald/thermal-conf.xml
<?xml version="1.0"?>
<ThermalConfiguration>
<Platform>
<Name>X86_configuration_générique</Name>
<ProductName>*</ProductName>
<Preference>QUIET</Preference>
<ThermalZones>
<ThermalZone>
<Type>cpu</Type>
<TripPoints>
<TripPoint>
<SensorType>x86_pkg_temp</SensorType>
<Temperature>70000</Temperature>
<type>max</type>
<ControlType>PARALLEL</ControlType>
<CoolingDevice>
<index>1</index>
<type>rapl_controller</type>
<influence> 100 </influence>
<SamplingPeriod> 16 </SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>2</index>
<type>intel_powerclamp</type>
<influence>100 </influence>
<SamplingPeriod> 12 </SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>3</index>
<type>intel_pstate</type>
<influence> 100 </influence>
<SamplingPeriod> 12 </SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>4</index>
<type>cpufreq</type>
<influence> 100 </influence>
<SamplingPeriod> 12 </SamplingPeriod>
</CoolingDevice>
</TripPoint>
</TripPoints>
</ThermalZone>
</ThermalZones>
</Platform>
</ThermalConfiguration>
$cat /etc/thermald/thermal-cpu-cdev-order.xml
<CoolingDeviceOrder>
<!-- Specify Cooling device order -->
<CoolingDevice>intel_pstate</CoolingDevice>
<CoolingDevice>rapl_controller</CoolingDevice>
<CoolingDevice>intel_powerclamp</CoolingDevice>
<CoolingDevice>cpufreq</CoolingDevice>
<CoolingDevice>Processor</CoolingDevice>
</CoolingDeviceOrder>