好的,首先,英语不是我的母语,所以我对任何错误的措辞表示歉意。
其次,我仍在学习 Linux,更具体地说是 Ubuntu 18.04。这是我第一次使用这个操作系统,我对终端、命令、软件包的了解仍然很基础。我能做的事情我不确定我是否完全理解。请耐心等待。
那么,问题来了。我最近决定尝试玩一些游戏,令我惊讶的是,之前在 W10 上可以玩的一些游戏由于性能问题而无法玩了。这些游戏的帧率从 35-45 fps 开始,然后突然下降到 1-15 fps(是的,1 fps!)。
起初我以为这可能与 gpu 或驱动程序有关,但事实并非如此,我从一些 ppa 获得了最新的驱动程序。游戏的图形质量很糟糕,但我开始注意到只有对 CPU 要求更高的游戏才会遇到这个问题。
然后我开始寻找跟踪 CPU 使用率的方法。系统监视器不够用,所以我找到了一些watch
跟踪 CPU 速度和 CPU 温度的命令。我必须安装lm-sensors
才能查看温度。
最后,看来我的笔记本电脑太薄了,导致过热,然后 CPU 节流,导致 fps 急剧下降。我根据温度升高时 CPU 速度突然下降得出了这一结论。但实际上我不能说我得到的温度是否那么高,我得到的最高温度是 CPU 上的 80°C 左右。而且,风扇似乎工作正常,转速约为 5000 RPM。
为了改善这种情况,我尝试将控制参数cpufreq
从省电改为性能。虽然这并没有解决性能下降的问题,但我注意到了一些改进。CPU 速度下降到 1600 MHz,而不是 600 Mhz。然后我开始思考是否应该设置最低 CPU 频率或停用缩放功能。但我担心这会导致过热然后熔化。我也可以尝试一些冷却器支持,但我不确定它们的效率。
那么,有人可以解释一下这个问题吗?
sudo lshw -c cpu
descrição: CPU
produto: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
fabricante: Intel Corp.
ID físico: 36
informações do barramento: cpu@0
versão: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
serial: To Be Filled By O.E.M.
slot: U3E1
tamanho: 2228MHz
capacidade: 3100MHz
largura: 64 bits
clock: 100MHz
lspci | grep -i VGA
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 620 (rev 02)
lspci | grep -i 3D
01:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 940MX] (rev a2)
xandr | grep connected
eDP-1-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 309mm x 174mm
tomaz@tomaz-Inspiron-7460:~$ stress-ng -t 5m -v --tz -c 4
stress-ng: debug: [15960] 4 processors online, 4 processors configured
stress-ng: info: [15960] dispatching hogs: 4 cpu
stress-ng: debug: [15960] cache allocate: default cache size: 3072K
stress-ng: debug: [15960] starting stressors
stress-ng: debug: [15961] stress-ng-cpu: started [15961] (instance 0)
stress-ng: debug: [15962] stress-ng-cpu: started [15962] (instance 1)
stress-ng: debug: [15960] 4 stressors spawned
stress-ng: debug: [15961] stress-ng-cpu using method 'all'
stress-ng: debug: [15964] stress-ng-cpu: started [15964] (instance 3)
stress-ng: debug: [15963] stress-ng-cpu: started [15963] (instance 2)
stress-ng: debug: [15964] stress-ng-cpu using method 'all'
stress-ng: debug: [15963] stress-ng-cpu using method 'all'
stress-ng: debug: [15962] stress-ng-cpu using method 'all'
stress-ng: debug: [15961] stress-ng-cpu: exited [15961] (instance 0)
stress-ng: debug: [15960] process [15961] terminated
stress-ng: debug: [15963] stress-ng-cpu: exited [15963] (instance 2)
stress-ng: debug: [15962] stress-ng-cpu: exited [15962] (instance 1)
stress-ng: debug: [15960] process [15962] terminated
stress-ng: debug: [15960] process [15963] terminated
stress-ng: debug: [15964] stress-ng-cpu: exited [15964] (instance 3)
stress-ng: debug: [15960] process [15964] terminated
stress-ng: info: [15960] successful run completed in 300.05s (5 mins, 0.05 secs)
stress-ng: info: [15960] cpu:
stress-ng: info: [15960] pch_skylake 59.25 °C
stress-ng: info: [15960] B0D4 62.12 °C
stress-ng: info: [15960] INT3400 Thermal 48.08 °C
stress-ng: info: [15960] SEN2 50.81 °C
stress-ng: info: [15960] TMEM 50.15 °C
stress-ng: info: [15960] x86_pkg_temp 54.88 °C
stress-ng: info: [15960] acpitz 50.61 °C
stress-ng: info: [15960] SEN1 50.78 °C
答案1
您应该能够使用以下命令将 CPU 频率上限限制为例如 65%:
echo 65 | sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pct
以上内容假设您正在使用 intel_pstate CPU 频率调节驱动程序,默认情况下您应该使用这个驱动程序。要检查:
doug@s15:~/temp$ 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
用于监控事物的一个非常好的工具是 turbostat,它包含在 linux-tools-common 包中。
下面是一个例子,我的电脑负载很重,处理器温度已经达到最高点。在另一个终端中,我限制了 CPU 频率(如下所示),您可以观察到频率、温度和功率下降:
doug@s15:~/temp$ sudo turbostat --quiet --Summary --show Busy%,Bzy_MHz,PkgTmp,PkgWatt --interval 15
Busy% Bzy_MHz PkgTmp PkgWatt
100.00 3500 79 63.91
100.00 3500 78 63.91
100.00 3500 78 63.91
100.00 3500 78 63.88
100.00 3500 79 63.89
100.00 3500 79 63.90
100.00 2755 70 45.86
100.00 2500 68 39.42
100.00 2500 67 39.26
100.00 2500 66 39.10
100.00 2500 65 39.07
100.00 2500 65 38.94
100.00 2500 64 38.93
100.00 2500 65 38.92
在另一个终端中执行的操作:
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
100
doug@s15:~$ echo 65 | sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pct
65
doug@s15:~$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
65
注意:2500 MHz CPU 频率是最接近 100 MHz 的四舍五入值(最接近 pstate 25)到 3800 * 0.65。但是,之前 turbostat 显示的是 3500 MHz。为什么?因为所有核心都很忙,因此处理器本身内部的最大 CPU 频率被限制为 3500 MHZ。如果不使用指令,也可以通过 turbostat 获得此信息quiet
。示例:
doug@s15:~/temp$ sudo turbostat --Summary --show Busy%,Bzy_MHz,PkgTmp,PkgWatt --interval 15
... [snip]...
cpu4: MSR_PLATFORM_INFO: 0x100070012200
16 * 100.0 = 1600.0 MHz max efficiency frequency
34 * 100.0 = 3400.0 MHz base frequency
cpu4: MSR_IA32_POWER_CTL: 0x0004005d (C1E auto-promotion: DISabled)
cpu4: MSR_TURBO_RATIO_LIMIT: 0x23242526
35 * 100.0 = 3500.0 MHz max turbo 4 active cores
36 * 100.0 = 3600.0 MHz max turbo 3 active cores
37 * 100.0 = 3700.0 MHz max turbo 2 active cores
38 * 100.0 = 3800.0 MHz max turbo 1 active cores
...[snip]...
有很多方法可以自动将 CPU 温度限制在低于极限值。一种方法是使用 thermald,我在另一个中有一个示例配置脚本回答。