我有一个朋友,他有一台全新的华硕笔记本电脑。我尝试使用 Ubuntu 18,它在我的华硕笔记本电脑上运行良好,但在他的笔记本电脑上,屏幕冻结,可能是因为不支持显卡驱动程序(我猜是这样的,但不确定)。
我在华硕论坛上看到安装 Ubuntu 19 可以让情况变得更好。事实就是如此。我们安装了它,现在情况好多了,除了一件事。
我们有 4 个 kidle_inject 进程,每个进程占用 50% 的 CPU,这导致计算机运行非常慢。我该如何禁用或降低 kidle_inject 进程的影响?
谢谢
答案1
kidle_inj 进程(每个 CPU 一个)是实现热节流以帮助保持处理器温度较低的一种方法。通常,由 thermald 调用,实际使用的方法是 CPU 频率缩放驱动程序的函数,可能通过文件进行覆盖/etc/thermald/thermal-cpu-cdev-order.xml
。
让我们来看几个例子。即使所有 CPU 的利用率都达到 100%,我的测试服务器也不会过热,因此我将为此设置一个 55 度的低热跳变点。
首先使用 intel_pstate CPU 频率调节驱动程序和 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
现在使用 turbostat 来监控事物,并观察最大性能设置(允许的最大 CPU 频率百分比)。它以不受限制的方式启动:
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
在上述过程中,最大百分比不断降低,直到负载消除后,处理器温度才下降:
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
其次,使用 acpi-cpufreq CPU 缩放驱动程序和 ondemand 调控器:
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
现在使用 turbostat 来监控事物,并观察 kidle_inject 线程。请注意,turbostat 输出中有一个附加列 %C6,这是我的处理器进入的最深空闲状态(通过“隐藏”而不是“显示”完成,因为“显示”方法不起作用)。
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
在节流期间,kidle_inj 任务强制进入深度空闲状态,处理器功率下降。
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 ...
您不应禁用正在使用的任何热保护方法,但您可以清洁风扇等,以帮助保持处理器温度较低。此外,如果您可以选择使用 pstate 节流方法,则剩余性能通常高于 kidle_inj 方法。例如,对于上述使用的工作流程,pstate 方法的性能比 intel_powerclamp kidle_inj 方法高出 33%。
现在,如果出于某种原因,您的处理器能够使用 intel_pstate CPU 频率调节驱动程序,但您选择不这样做,那么建议使用 intel_cpufreq 驱动程序(它只是被动模式下的 intel_pstate 驱动程序)和 ondemand 调节器。为什么?因为这样将使用 pstate 节流方法。在我的系统上,在相同的节流条件下,与 kidle_inject 方法相比,性能提高了约 28%。
如何从 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
并设定了州长:
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
为什么性能上有如此大的差异? 因为 kidle_inj 方法浪费了大量的时间和精力进入和退出深度空闲状态,而 pstate 方法则不会。
对于看到“idle_inject”而不是“kidle_inj”或除了“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]
截至内核 4.19,这相对较新,内核配置参数是“CONFIG_IDLE_INJECT”,它是为 Ubuntu 内核设置的,但我还不知道其用途。
编辑(2019.08.09,8月9日):
读者请注意,对于 intel_cpufreq CPU 频率调节驱动程序(被动模式下的 intel_pstate)以及 acpi-cpufreq 驱动程序和 schedutil 调节器,某些错误可能会导致 thermald 无法正常工作。系统可能无法接受最大允许 CPU 频率的降低。修复这些问题的补丁正在进行中,但需要一段时间才能传播。
答案2
如果你没有,请创建该文件/etc/modprobe.d/disable-powerclamp.conf
并添加以下行:
blacklist intel_powerclamp