2 votes

Ubuntu 19 processus kidle_inject

J'ai un ami qui a un ordinateur portable ASUS tout neuf. J'ai essayé d'utiliser Ubuntu 18 qui fonctionne bien sur mon portable ASUS, mais sur son portable, l'écran se figeait peut-être à cause de pilotes graphiques non supportés (je suppose mais je n'en suis pas sûr).

J'ai lu sur les forums d'ASUS que l'installation d'Ubuntu 19 peut améliorer les choses. C'est le cas. Nous l'avons installé et c'est mieux maintenant sauf une chose.

Nous avons 4 processus kidle_inject qui utilisent chacun 50% du CPU ce qui rend l'ordinateur vraiment lent. Comment puis-je désactiver ou réduire l'impact des processus kidle_inject ?

Merci

9voto

Doug Smythies Points 12803

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.

0voto

Adam Felson Points 61

Si vous ne l'avez pas, créez le fichier /etc/modprobe.d/disable-powerclamp.conf

et ajoutez la ligne :

blacklist intel_powerclamp

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X