
444,有妖气,快跑
为了让帖子不那么水,顺便把之前踩的一个坑发一发。
这颗 i7-10700 标称睿频 4.8GHz。我最近才发现,它从装机起就没跑到过 2.9GHz 以上。
不是降频,不是过热,不是电源模式没调对。是 BIOS 里有个开关是关的——而这件事在操作系统里,你查不出来、也改不了。
先科普一下:基频和睿频是两个东西
CPU 参数表上通常有两个频率,很多人只看后面那个大的:
- 基础频率(这颗是 2.9GHz)——厂商保证在标称散热和功耗条件下,所有核心持续跑得动的频率。它是个承诺。
- 睿频 / Turbo Boost(这颗单核 4.8GHz、全核 4.6GHz)——当温度、功耗、电流都有余量时,CPU 自己决定往上冲的频率。它是个上限,不是承诺。
关键在于:睿频不是"超频"。它是 Intel 官方特性,出厂就该开着,用不用得上由 CPU 根据实时状态自己判断。你花钱买的那个 4.8GHz 就是它。
所以睿频被关掉意味着什么?CPU 被永久钉死在"保证值"上,永远拿不到那 60% 的上浮空间。 而系统跑得好好的,什么都不报错。
我的现象就是这样:
$ grep MHz /proc/cpuinfo
cpu MHz : 2899.997
cpu MHz : 2899.997
满载 2900,空载 2900,一动不动,正好等于基频。
第一反应是错的
看到频率上不去,我先怀疑是调度策略:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
powersave
刷成 performance。频率纹丝不动。
这里就有个信号值得注意了:如果只是省电策略保守,改完至少会有变化。一点变化都没有,说明限制在更底层。
三条证据
第一条:内核拒绝了 root 的写入。
$ sudo bash -c 'echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo'
bash: echo: 写入错误: 不允许的操作
注意这是 root 身份下的 EPERM。这不是权限不够,是内核在说"这件事我做不了"。
第二条:dmesg 直说了。
intel_pstate: Turbo disabled by BIOS or unavailable on processor
但这句有个"or"——到底是 BIOS 关的,还是这颗 CPU 压根不支持?得再往下一层。
第三条:直接读 MSR。
MSR(Model Specific Register)是 CPU 内部的控制寄存器,管着一大堆硬件行为开关。Linux 提供了 msr 模块可以直接读写:
$ sudo modprobe msr
$ sudo rdmsr 0x1a0
4000850089

0x1A0 这个寄存器的 bit 38 是 Turbo Disable 位。0x4000000000 正好是 2^38,所以读出来的这个值 bit38 = 1——是固件把它置起来的。
再看另一个寄存器确认 CPU 本身的能力:
$ sudo rdmsr 0x1ad
2e2e2e2e2f2f3030
每两个十六进制位是一档倍频,从低位起依次对应 1 核活跃、2 核活跃……的最大倍频。0x30 = 48 → 4.8GHz,0x2e = 46 → 4.6GHz。
结论明确了:CPU 支持单核 4.8G、全核 4.6G,是被 BIOS 锁在 2.9G 的。
为什么系统里改不了
这一点值得单独说,因为它决定了所有"用脚本/服务/内核参数解决"的思路都是死路。
/sys/devices/system/cpu/intel_pstate/no_turbo 这个节点,在 BIOS 禁用 Turbo 时是只读的。内核里 store_no_turbo() 的逻辑是:先检查全局标志 turbo_disabled,为真就直接返回 -EPERM。而这个标志正是启动时从 IA32_MISC_ENABLE 的 bit38 读出来的。
换句话说:固件说了不算数的事,内核不会替你违抗。 这是设计如此,不是 bug。
⇒ 只能进 BIOS。我这台是联想 ThinkServer,路径在 高级菜单 → CPU 菜单 → Turbo模式。
顺带一提,不同产品线的 BIOS 菜单结构差别很大。我一开始按 ThinkCentre 的路径去找,压根没有那一项。先看主板或整机的商标标识,再去对路径。
改完之后
|
改前 |
改后 |
|---|
no_turbo |
1 |
0 |
MSR 0x1A0 |
4000850089 |
850089 |
cpuinfo_max_freq |
2.9 GHz |
4.8 GHz |
dmesg |
Turbo disabled by BIOS |
HWP enabled |
轻载实测 |
2900 MHz |
4600 MHz |
16 线程满载 |
2900 MHz |
3100~3700 MHz |
满载没跑到 4.6G,这不是没开好
改完看到满载只有 3100~3700,我一度怀疑没生效。查了温度:
Package id 0: +79°C (high = +80.0°C, crit = +100.0°C)
79°C,紧贴着 80°C 的阈值。
这台是小机箱的商用整机,散热能力有限。睿频的本质就是"在温度和功耗允许的范围内自己往上冲"——现在温度不允许了,它自己就收着跑。
这其实正是 BIOS 里那句说明写的:"可以使处理器评估其本身的散热、电流和功率动态地调整出一个适合的频率上限。"
所以这不是没开好,是瓶颈从"BIOS 开关"转移到了"散热"。想再放开一截,得清灰换硅脂,或者调 BIOS 里的风扇策略。
但即便被散热压着,满载相比原来仍有 7~27% 的提升,而轻载和单线程场景是实打实从 2.9G 到了 4.6G——日常响应速度的差别,比跑分上那点百分比明显得多。
花一分钟查查你的机器
cat /sys/devices/system/cpu/intel_pstate/no_turbo
dmesg | grep -i turbo
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
如果 cpuinfo_max_freq 恰好等于你的基础频率,那基本就中了。
这类问题特别容易长期潜伏:机器能开机、能干活、跑分也不算难看,只是比它应有的样子慢一大截。没有任何日志会告诉你"你的 CPU 本可以快 60%"。
品牌整机、二手机器、公司发的开发机,都值得查一眼——出厂或者前任用户为了控制发热噪音关掉这个开关,是相当常见的事。