![AMD Ryzen 笔记本电脑忽略 tlp 设置的最大 CPU 频率](https://linux22.com/image/947742/AMD%20Ryzen%20%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E5%BF%BD%E7%95%A5%20tlp%20%E8%AE%BE%E7%BD%AE%E7%9A%84%E6%9C%80%E5%A4%A7%20CPU%20%E9%A2%91%E7%8E%87.png)
这是在 Kubuntu 22.04 LTS 上。
为了延长 Ryzen 9 5900HX 笔记本电脑的电池寿命,我安装了该tlp
服务并在 /etc/tlp.conf 中对其进行了如下配置(此处未提及的所有配置均保持不变):
CPU_SCALING_GOVERNOR_ON_AC=ondemand
CPU_SCALING_GOVERNOR_ON_BAT=conservative
CPU_SCALING_MAX_FREQ_ON_AC=4680000
CPU_SCALING_MAX_FREQ_ON_BAT=1800000
频率设置正确,可以从以下结果看出:cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
1800000
不幸的是,CPU 不尊重这些频率,通过以下方式验证:grep MHz /proc/cpuinfo
当所有核心都处于繁忙状态时,最大频率似乎会受到一定程度的尊重,就像下面的结果一样:
cpu MHz : 2180.130
cpu MHz : 2179.499
cpu MHz : 2178.976
cpu MHz : 2176.884
cpu MHz : 2176.504
cpu MHz : 2175.368
cpu MHz : 2174.998
cpu MHz : 2173.944
cpu MHz : 2173.575
cpu MHz : 2172.539
cpu MHz : 2172.196
cpu MHz : 2171.268
cpu MHz : 2170.889
cpu MHz : 2169.865
cpu MHz : 2169.522
cpu MHz : 2168.473
然而,当只使用少数核心的时候,画面其实是这样的:
cpu MHz : 2967.377
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 3004.301
cpu MHz : 400.000
cpu MHz : 1710.000
cpu MHz : 2863.831
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 1440.000
cpu MHz : 4029.349
cpu MHz : 400.000
cpu MHz : 400.000
因此在我看来,“所有核心以 1800 MHz 运行”的可用功率被重新分配给实际活动的核心,从而使其中三个核心以 3000 MHz 左右运行,一个核心甚至以 4000 MHz 运行。
我不想要那种权力转移!主要原因是,我倾向于打开相当多的浏览器选项卡,而且(太多)现代网站都有一些后台任务,让 Firefox 忙个不停,因此总有一两个核心处于满载状态。但我不想让它们跳到涡轮频率,不必要地消耗我的电池。所以我希望所有核心都保持在选定的频率以下。
以下是来自cpupower frequency-info
analyzing CPU 0:
driver: amd-pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 131 us
hardware limits: 400 MHz - 4.68 GHz
available cpufreq governors: conservative ondemand userspace powersave performance schedutil
current policy: frequency should be within 400 MHz and 1.80 GHz.
The governor "conservative" may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 3.09 GHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes
Boost States: 0
Total States: 3
Pstate-P0: 3300MHz
Pstate-P1: 1300MHz
Pstate-P2: 1200MHz
可以清楚地看到,策略在 400 MHz 和 1.80 GHz 之间,但实际频率为 3.09 GHz,Pstate-P0 甚至是 3.3 GHz。
在另一个答案中,建议使用cpupower frequency-set --max 1800000
,但这也没有任何效果。
答案1
这可能与内核错误有关,睡眠后,驱动程序不再遵守最大频率:
https://bugzilla.kernel.org/show_bug.cgi?id=215938
然而,重启系统并没有改变这种情况:
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 3268.709
cpu MHz : 400.000
cpu MHz : 2614.703
cpu MHz : 400.000
cpu MHz : 2789.985
cpu MHz : 2847.641
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
好吧,重启后等待了几分钟,情况确实正确了:
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 1480.040
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 1479.909
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 400.000
cpu MHz : 1773.580
cpu MHz : 400.000
因此,这很可能与上述内核错误有关,当缩放错误错误被移植到 22.04 LTS 内核中时,这个问题就会消失。是的,我希望它被移植回来,因为运行频率过高会耗尽电池,最终会导致拒绝服务!