Protection thermique

thermald est un dispositif de protection contre la surchauffe, tout particulièrement adapté aux processeurs intel. Il s'appuie pour cela sur les modules :

thermald arrive avec une configuration par défaut directement utilisable.

1 - Installation

1.1 - Préalables

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,

$ 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
$ lsmod |grep intel_rapl
intel_rapl 20480 0

$ cat /sys/devices/virtual/powercap/intel-rapl/enabled
1
$ lsmod |grep intel_powerclamp
intel_powerclamp 16384 0
$ grep -n intel_powerclamp /sys/class/thermal/cooling_device*/type
/sys/class/thermal/cooling_device4/type:1:intel_powerclamp
$ cat /sys/class/thermal/cooling_device4/cur_state 
-1
$ 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 :
$ 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.

1.2 thermald

1.2.1 Installation

# aptitude install thermald
$ 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
# systemctl stop thermald
# thermald --no-daemon --loglevel=info (ou debug)

1.2.2 Configuration

Le fichier de configuration personnalisable est en /etc/thermald/thermald-conf.xml. Il est possible de définir

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 :

2 - Tests

2.1 - Principe

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

2.2 - Résultats résumés

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

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

2.3 - Résultats détaillés

2.3.1 Sans protection thermique

Lorsque thermald n'est pas actif :

# 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
# 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

2.3.2 Avec protection thermique et la configuration thermald-conf.xml par défaut

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

Performance - thermald standard

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

Powersave -thermald standard

2.3.3 Avec protection thermique et configuration thermald-conf.xml "70°C max "

# 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

Powersave - thermald - perso

# 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

psensor - ffmpeg performance 70°C

Annexe 1 - thermald-conf.xml "70°C max"

$ 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>

Annexe 2 - thermal-cpu-cdev-order.xml

$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>