Les processus kidle_inj, un par CPU, sont un moyen de réaliser un étranglement thermique pour aider à garder votre processeur plus frais. Généralement invoquée par thermald, la méthode utilisée est une fonction du pilote de mise à l'échelle de la fréquence du processeur, avec la possibilité de la remplacer par la commande /etc/thermald/thermal-cpu-cdev-order.xml
archivo.
Prenons quelques exemples. Même avec une utilisation à 100 % de tous les processeurs, mon serveur de test ne surchauffe pas. Je vais donc fixer un seuil de déclenchement thermique de 55 degrés.
D'abord en utilisant le pilote intel_pstate de mise à l'échelle de la fréquence du CPU et le gouverneur powersave :
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
Utilisez maintenant turbostat pour surveiller les choses, et observez également le paramètre de performance maximale (fréquence maximale autorisée du CPU en pourcentage). Il commence sans étranglement :
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
100
.
doug@s15:~$ sudo turbostat --quiet --Summary --show Busy%,Bzy_MHz,PkgTmp,PkgWatt --interval 5
Busy% Bzy_MHz PkgTmp PkgWatt
0.02 1600 26 3.70
0.03 1600 26 3.70
2.21 3737 38 6.87
38.89 3564 48 42.70
94.64 3500 50 58.54 <<< Load being ramped up.
100.00 3500 52 58.49 <<< Processor package temperature going up.
100.00 3500 53 58.78
100.00 3500 56 59.04
100.00 3500 56 59.27
100.00 3123 53 51.18 <<< Notice throttling via clock frequency
100.00 2969 56 47.32
100.00 2693 52 41.90
100.00 2009 53 28.98
100.00 2489 55 37.90
100.00 2431 54 36.82
100.00 2620 54 40.50
100.00 2409 55 36.39
100.00 2511 54 38.47
100.00 2569 57 39.61
100.00 2301 53 34.57
100.00 1682 53 23.64
100.00 2089 54 30.52
100.00 2569 56 39.59
100.00 2301 52 34.55
87.08 1671 53 22.98
48.70 2037 52 24.04
5.58 2318 44 7.50
0.02 1603 40 3.88
0.03 1600 40 3.87
0.02 1600 39 3.85
^C0.04 1600 38 3.86
Et pendant ce temps, le pourcentage maximum a été réduit, jusqu'à ce que la charge soit retirée et que la température du processeur baisse :
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
60
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
60
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
100
Deuxièmement, utilisez le pilote de mise à l'échelle du processeur acpi-cpufreq et le gouverneur à la demande :
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
acpi-cpufreq
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
Maintenant, utilisez turbostat pour surveiller les choses, et aussi regarder les fils de kidle_inject. Remarquez que la sortie de turbostat a une colonne ajoutée, %C6 qui est l'état d'inactivité le plus profond dans lequel se trouve mon processeur (fait via "hide" au lieu de via "show" parce que la méthode "show" ne fonctionne pas).
doug@s15:~$ sudo turbostat --Summary --quiet --hide IRQ,Avg_MHz,SMI,GFXMHz,TSC_MHz,GFXWatt,CorWatt,POLL%,CPU%c1,CPU%c3,CPU%c7,CoreTmp,GFX%rc6,Pkg%pc2,Pkg%pc3,Pkg%pc6,POLL,C1,C1E,C3,C6,C1%,C1E%,C3%,C6% --interval 5
Busy% Bzy_MHz CPU%c6 PkgTmp PkgWatt
0.05 1602 99.83 26 3.71
0.04 1600 99.87 28 3.71
0.05 1600 99.83 26 3.71
0.05 1601 99.84 26 3.71
24.67 3591 52.79 45 30.24
93.87 3500 0.00 47 58.30 <<< Load ramped up
100.00 3500 0.00 50 58.42
100.00 3500 0.00 53 58.70
100.00 3500 0.00 55 58.99
100.00 3500 0.00 56 59.23
93.72 3424 6.18 56 54.44 <<< Now some C6 idle time is forced via kidle_inj
81.41 3223 18.32 54 44.49
77.81 3179 21.82 56 42.02
83.82 3348 15.90 57 48.14
78.87 3278 20.78 54 44.52
66.34 3061 33.15 54 35.02
62.65 2898 36.78 54 30.80
61.20 2856 38.20 53 29.63
63.71 3051 35.73 54 33.36
61.67 2938 37.76 54 30.90
61.92 2929 37.53 52 30.95
63.47 3039 35.97 55 33.17
60.87 2862 38.52 56 29.60
62.90 3073 36.56 53 33.40
62.36 2964 37.09 55 31.61
61.16 2866 38.24 53 29.78
63.98 3099 35.43 55 34.28
56.37 2708 43.01 52 25.80
52.01 2616 47.29 53 23.07
58.24 2738 41.15 53 26.86
65.39 3143 34.05 56 35.60
68.01 3209 31.50 56 38.09
58.62 2949 40.79 53 29.83
58.43 2730 40.95 53 26.88
48.87 3158 36.84 53 33.68
14.74 2642 70.22 43 14.77
0.37 1602 99.10 42 4.02
0.29 1601 99.30 40 3.97
0.23 1602 99.43 40 3.94
0.17 1601 99.58 39 3.91
0.17 1686 99.56 38 3.91
0.06 1601 99.79 38 3.85
0.04 1602 99.87 36 3.83
0.04 1600 99.88 36 3.83
0.09 1750 99.75 35 3.85
0.04 1600 99.89 35 3.82
0.04 1600 99.85 36 3.82
0.04 1600 99.88 34 3.81
0.04 1600 99.86 35 3.80
^C0.04 1600 99.87 33 3.80
Et pendant l'étranglement, les tâches kidle_inj forcent l'état d'inactivité profonde et la puissance du processeur diminue.
doug@s15:~$ ps aux | grep kidle
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3005 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/0]
root 3006 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/1]
root 3007 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/2]
root 3008 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/3]
root 3009 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/4]
root 3010 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/5]
root 3011 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/6]
root 3012 33.2 0.0 0 0 ? S 00:19 0:32 [kidle_inj/7]
doug@s15:~$ ps aux | grep kidle
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3005 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/0]
root 3006 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/1]
root 3007 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/2]
root 3008 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/3]
root 3009 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/4]
root 3010 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/5]
root 3011 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/6]
root 3012 33.5 0.0 0 0 ? S 00:19 0:35 [kidle_inj/7]
doug@s15:~$ ps aux | grep kidle
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3005 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/0]
root 3006 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/1]
root 3007 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/2]
root 3008 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/3]
root 3009 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/4]
root 3010 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/5]
root 3011 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/6]
root 3012 29.1 0.0 0 0 ? S 00:19 0:44 [kidle_inj/7]
doug@s15:~$ ps aux | grep kidle
... throttling over, processes gone ...
Vous ne devez pas désactiver la méthode de protection thermique que vous utilisez, mais vous pouvez nettoyer vos ventilateurs et autres pour aider à maintenir le processeur plus frais. De plus, si vous avez la possibilité d'utiliser la méthode d'étranglement pstate, les performances restantes sont généralement supérieures à celles de la méthode kidle_inj. Par exemple, et pour le flux de travail utilisé ci-dessus, la méthode pstate surpasse de 33% la méthode intel_powerclamp kidle_inj.
Maintenant, si pour une raison quelconque, votre processeur est capable d'utiliser le pilote intel_pstate de mise à l'échelle de la fréquence du CPU, mais que vous avez choisi de ne pas le faire, alors la suggestion est d'utiliser le pilote intel_cpufreq (qui est juste le pilote intel_pstate en mode passif) et le gouverneur à la demande. Pourquoi ? Parce qu'alors la méthode d'étranglement pstate sera utilisée. Sur mon système, il en résulte une amélioration des performances d'environ 28 % par rapport à la méthode kidle_inject dans les mêmes conditions d'étranglement.
Comment passer de intel_pstate à intel_cpufreq ?
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/status
active
doug@s15:~$ echo passive | sudo tee /sys/devices/system/cpu/intel_pstate/status
passive
Et mettre le gouverneur en place :
doug@s15:~$ sudo su
root@s15:/home/doug# for file in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo "ondemand" > $file; done
root@s15:/home/doug# exit
exit
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
doug@s15:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
ondemand
Pourquoi y a-t-il une telle différence de performance ? Parce que la méthode kidle_inj gaspille beaucoup de temps et d'énergie à entrer et sortir de l'état d'inactivité profonde, alors que la méthode pstate ne le fait pas.
Et pour les utilisateurs qui voient "idle_inject" au lieu de, ou en plus de, "kidle_inj" :
doug@s15:~$ ps aux | grep idle
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 12 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/0]
root 16 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/1]
root 22 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/2]
root 28 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/3]
root 34 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/4]
root 40 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/5]
root 46 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/6]
root 52 0.0 0.0 0 0 ? S 09:07 0:00 [idle_inject/7]
C'est relativement récent, à partir du noyau 4.19, et le paramètre de configuration du noyau est "CONFIG_IDLE_INJECT", qui est défini pour les noyaux Ubuntu, mais je ne sais pas encore à quoi cela sert.
EDIT (2019.08.09, 9 août) :
Les lecteurs doivent savoir que pour le pilote de mise à l'échelle de la fréquence du CPU intel_cpufreq (intel_pstate en mode passif), ainsi que pour le pilote acpi-cpufreq et le gouverneur schedutil, certains bogues peuvent empêcher le fonctionnement correct de thermald. Une réduction de la fréquence maximale autorisée du CPU peut ne pas être honorée par le système. Des correctifs pour résoudre ces problèmes sont en cours, mais leur propagation prendra un certain temps.