后端 / 嵌入式 / 环境搭建 / 生活技巧 · 2026年 7月 3日 0

联想笔记本 arch 功耗释放瓶颈

状态栏点了性能模式,CPU 却没什么感觉

状态栏图标好用,点一下就能在省电 / 均衡 / 性能之间切换,power-profiles-daemon 也正常响应。但主观体感上,”性能模式”跑起来跟没切一样——负载稍微重一点,风扇没怎么转起来,机器也不怎么发热,任务完成速度也没有想象中利索。

通常是这几个:

  • EPP(能量性能偏好)没拉满,驱动偷懒用了保守策略
  • 功耗墙(PL1/PL2)被厂商锁得太死
  • 温度墙触发得太早
  • 内核调度器不给力

于是排查就是照着这几个一个个去查、去排除的过程。

第一轮:查静态配置,全部正常

先上 turbostat 把 CPU 的寄存器全部倒出来看:

cpu0: MSR_HWP_REQUEST: 0x00002404 (min 4 max 36 des 0 epp 0x0 window 0x0 pkg 0x0)

epp 0x0 就是 performance,已经是拉满状态,不是它的锅。

intel-rapl:0: package-0 28.0s:30W,max:15W 2.4ms:50W
PKG Limit #1: 30.000 Watts, 28s, clamp ENabled
PKG Limit #2: 50.000 Watts, 0.002441s
MSR_IA32_TEMPERATURE_TARGET: 93 C

功耗墙:长期 30W(标称 15W 芯片的两倍),短时冲到 50W,温度墙 93°C。数字看起来没有被锁死,理论上应该能跑得很暴力才对。

继续查 cpufreq、governor、ACPI 平台档位、有没有 TLP 之类的电源管理软件互相打架:

bash

cat /sys/devices/system/cpu/intel_pstate/max_perf_pct   # 100
cat /sys/devices/system/cpu/intel_pstate/no_turbo       # 0
cat /sys/firmware/acpi/platform_profile                  # performance

清一色全部”全开”状态。dmesg 里搜 thermal|throttl|prochot 也没有任何降频记录。

到这一步,操作系统能暴露出来的每一层开关都查了个遍,全部正常。 这其实是排查里最容易卡住的阶段——所有你能想到、能查到的地方都没问题,但症状确实存在。

第二轮:不看静态配置,直接上真实满载测试

静态寄存器只是”承诺值”,不代表运行时真实生效的值。于是不再看 dump,直接拿 stress-ng 打满 8 线程,用 turbostat 逐秒记录:

bash

sudo stress-ng --cpu 8 --timeout 30 &
sudo turbostat --interval 1 --show PkgWatt,Bzy_MHz,PkgTmp > /tmp/turbo_log.txt &
wait

结果是全次排查里最关键的一份数据:

时间频率功耗温度
0-7秒3300MHz30-34W74-85°C
~8秒跳水跳水—
9-30秒死死钉在 2000-2100MHz14-16W稳定 64-66°C

CPU 前 7 秒确实全力冲刺,睿频拉满、功耗摸到 30W+,证明硬件本身完全没问题。但 8 秒左右,毫无征兆地直接腰斩到 2.1GHz,此后 20 多秒像焊死了一样纹丝不动。

这里有两个反常的地方,直接排除了”正常触顶”的可能:

  1. 温度还有大把余量——腰斩后温度降到 64°C,离 93°C 的墙还差 29 度,不是热到降频;
  2. 功耗远低于承诺的 30W——腰斩后功耗只有 15W 左右,而这个数字恰好精确等于芯片的出厂标称 TDP,不是 MSR 里写的 30W。

正常的功耗墙触发,应该是频率和功耗围绕着上限反复试探、有起伏波动;而这里是一条从满血直接切到低速的硬边界,切下去之后完全不带任何试探——这不是驱动在”算”出来的降频,更像是有个东西直接、粗暴地把上限从外部重新写了一遍。

定位:EC 固件绕过标准寄存器

dmesg 里有一行之前一直被忽略的信息:

PCI: Lenovo *IIL* product version detected

这就是关键线索。Lenovo 笔记本的 EC(嵌入式控制器)固件有个业内皆知的行为:它不走操作系统能看到的标准 RAPL MSR 通道,而是通过独立的私有接口,周期性地重新把功耗上限压回自己认定的保守值,完全不理会 BIOS 在 MSR 里写的那个更宽松的数字。这也正是为什么 Windows 下这颗芯片能跑得很猛——Lenovo Vantage 会一直在后台跟 EC “谈判”、反复喂给它更高的功耗请求;而 Linux 下没有对应的用户态程序去做这件事,EC 就会在几秒钟的空窗期后按自己默认的保守逻辑接管,把功耗砍回标称 TDP。

顺带一提,这也是为什么早年那个专门对付这个问题的开源工具,叫 lenovo_fix——它不是什么”额外的性能解锁”,从名字就能看出来,它的定位就是去对抗这个隐藏的限制,而不是常规意义上的超频工具。

解决方法:用更快的轮询节奏抢在 EC 前面

思路很直接:既然 EC 是周期性重写寄存器,那就用一个用户态服务,以比它更高的频率反过来重写回去,抢在它介入之前把想要的值摁住。

bash

sudo pacman -S throttled
sudo systemctl enable --now throttled.service

配置基于实测数据来定,而不是抄网上现成的桌面级数字(这颗芯片是 15W 标称的轻薄本 U 系列,套用桌面级的 65W/90W 配置只会导致过流保护甚至硬件损伤):

ini

[GENERAL]
Enabled: True
Poll_Interval: 3000

[BATTERY]
Update_Rate_s: 30
PL1_Tdp_W: 15
PL1_Duration_s: 28
PL2_Tdp_W: 25
PL2_Duration_s: 0.002
Trip_Temp_C: 85

[AC]
Update_Rate_s: 3
PL1_Tdp_W: 28
PL1_Duration_s: 28
PL2_Tdp_W: 45
PL2_Duration_s: 0.01
Trip_Temp_C: 88

Poll_Interval: 3000(3秒轮询)是关键——比之前实测到的 EC 大约 7-8 秒才介入一次的节奏更快,理论上能在 EC 出手之前反复把功耗值重新钉住。

效果验证

装完之后重新跑了一次同样时长的满载测试,结果对比:

装 throttled 之前装 throttled 之后
8秒后频率跳水到 2100MHz全程稳定 3300MHz
功耗跳水到 15W稳定 30-36W
30秒内跳水次数持续被压制零次
温度卡在 64°C自然爬升到 88°C 触及设定墙

风扇转起来了,机身也热起来了——这是好事,说明 CPU 终于是在真的燃烧,而不是被闷在低速状态下”假装”在跑。最后几秒温度摸到设定的 88°C 墙时,系统还能做出正常的边界内微调(3300→3294→3290→3284),说明整套配置是在正常工作,不是粗暴一刀切。

吐槽

折腾了小十轮 turbostat,从怀疑 EPP、怀疑 governor、怀疑温度墙、怀疑电池模式,一路排除嫌疑人排除到最后,发现真凶是笔记本自己的固件在演戏——Windows 下靠 Lenovo Vantage 一直喂着它才显得”很正常”,换个系统它就原形毕露,摆明了是”没人管我就摆烂”的架势。

这软件的开源作者当年取名 lenovo_fix,属实是相当克制了;用户群里但凡用过这玩意儿排查过同款问题的,大概都会打心底里觉得,这名字应该叫 lenovo_fuck 才更贴切——不过话说回来,Dell、HP、华硕家的 EC 也不是什么省油的灯,只是 Lenovo 用户基数大、社区声量大,第一个把这坑填出来给全世界抄作业罢了。东西能用就行