Ubuntu解锁睿频限制
2023-08-25 others根据公司相关要求,把自己的主机换成了公司的笔记本。在 Windows 11 上测试了 Hyper-V 虚拟机和 WSL 2,感觉使用 vscode remote 搭建开发环境还是不太方便。
与相关部门进行沟通后,确认公司允许使用 Ubuntu Desktop 作为本地开发环境,于是将笔记本重装为 Kubuntu,期望能接近在 Arch Linux 上的 KDE 使用体验。
测试 Kubuntu 的过程中发现笔记本 CPU 的最大频率明显比 Windows 11 上的低,因此尝试排查具体原因,寻找解决办法。
硬件信息
- 商品详情:ThinkBook 14+ 2023
- 基础配置:i5-13500H 32GB+512GB 2880x1800 90Hz
- CPU详情:i5-13500H
- 总计:12C16T (4P+8E)
- P核频率:2.6GHz Base, 4.7GHz Turbo
- E核频率:1.9GHz Base, 3.5GHz Turbo
- TDP:45W Base, 95W Turbo

问题描述
在 Windows 11 上测试 Hyper-V 虚拟机时安装的是 Arch Linux,虚拟机内使用 stress --cpu 2 --timeout 30 命令跑满双核。
虚拟机内 htop 命令输出中看到两个 CPU 核心频率接近 4700MHz,Windows 11 任务管理器中显示 CPU 速度最大超过 4.5GHz,基本符合预期。
在 Kubuntu 上搜索 stress 命令时,发现有新版的 stress-ng,于是使用 stress-ng --cpu 2 --timeout 30 命令跑满双核。
终端内 htop 命令输出中看到两个 CPU 核心频率接近 3800MHz,与标称的 4.7GHz 有较大差距,笔记本风扇噪音也不如 Windows 11 下测试时明显。

原因分析
刚拿到笔记本时就翻了一遍 BIOS 设置,在里面开启了野兽增强模式,相关功能描述是需要连接原装的 100W 电源适配器,最大功率下可能会从笔记本电池取电。因此 BIOS 设置始终是未做限制的状态,有区别的只是运行的操作系统。
起初怀疑是 Ubuntu 22.04.3 LTS 的 6.2 内核还不够新,对 13 代酷睿的支持不够完善,于是使用 2023.08.01 的 Arch Linux live CD 进行了测试,发现在 6.4 内核下性能表现并没有改善,CPU 最大频率依旧只能接近 3800MHz,遂排除内核版本的影响。
以 linux cpu frequency 为关键词进行搜索,找到了 ArchWiki 上的 CPU frequency scaling,浏览过后感觉各个模块都讲得十分清晰。计划是始终连接电源把笔记本当作主机使用,不关心节能和续航,所以主要关注文档的前三部分:Scaling drivers,Scaling governors 和 Userspace tools。
Scaling drivers
现代的英特尔 CPU 默认使用 intel_pstate 驱动程序,支持额外配置频率限制或关闭睿频 Intel Turbo Boost,可以通过 sysfs 查看和修改。
- 执行
cat /sys/devices/system/cpu/intel_pstate/no_turbo确认结果为 0,即睿频已开启。 - 执行
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq确认最大频率无特殊限制,4个P核是 4.7GHz,8个E核是 3.5GHz。

Scaling governors
如果使用的是 intel_pstate 驱动程序,那么就只有 powersave 和 performance 两个方案可选,且默认方案为 powersave。两个方案都是动态调频,但侧重点不同。
- 执行
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor确认结果为powersave,存在性能限制。 - 执行
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor调整方案为性能优先,即时生效。
再次使用 stress-ng --cpu 2 --timeout 30 命令跑满双核进行测试,发现 CPU 频率达到预期:

Userspace tools
ArchWiki 这边列举了很多工具,例如 thermald,cpupower,power-profiles-daemon 等,但并不确定在 Ubuntu 22.04.3 LTS 上是否可用,于是以 ubuntu cpu frequency scaling 为关键词进行搜索,在 Ask Ubuntu 上找到了一个 2014 年的相关问题,回复中使用的工具是 cpufrequtils。
继续搜索 cpufrequtils 相关信息,发现 Ubuntu Wiki 中基本没有任何说明,ThinkWiki 中相关页面的最后更新时间是 2007 年,而 Debian Wiki 则在 CPU frequency scaling 页面中明确指出了 cpufreq is being replaced by cpupower。
于是搜索 cpufrequtils cpupower 尝试查找两者关系,发现最早在 2012 年的 Arch Linux Forums 上就有相关讨论了,并且提到 cpupower was introduced with kernel 3.1 and it is a replacement for cpufreq,根据 Linux 3.1 对应的 changelog 也可以验证这一说法。那么命令行工具就选择 cpupower 了。
解决办法
综上,解决办法为:在 Kubuntu 上使用 cpupower 将电源方案持久化为性能优先。
使用 apt search cpupower 只查找到了 cpupower-gui 一个软件包,于是使用 apt-file search bin/cpupower 搜索文件列表,结果中的 linux-tools-common 看起来是最通用的版本。通常 Ubuntu 软件包名中的 -common 后缀意味着是通用依赖,例如 mysql-common 就是 mysql-client 和 mysql-server 的通用依赖,因此尝试使用 apt-cache rdepends linux-tools-common 查找反向依赖,最终递归查找到了 linux-tools-generic-hwe-22.04。

安装 linux-tools-generic-hwe-22.04 之后就可以使用 cpupower frequency-info 和 cpupower frequency-set 命令进行查询和修改了。

参考 Arch Linux 上的 cpupower 软件包补充了 /etc/systemd/system/cpupower.service,随后执行 systemctl daemon-reload 和 systemctl enable cpupower,配置为开机启动项。
[Unit]
Description=Apply cpupower configuration
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set --governor performance
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
PS
搜索 scaling_governor 的过程中找到了挺多发行版的说明文档,例如:
- ArchWiki: CPU frequency scaling
- Gentoo Wiki: Power management/Processor
- Debian Wiki: CPU frequency scaling
- Ubuntu Community Help Wiki: PowerManagement/ReducedPower
- openSUSE Leap Doc: System Analysis and Tuning Guide/Power management
- Red Hat Enterprise Linux Doc: Tuning CPU frequency to optimize energy consumption
对比下来 Arch Linux,openSUSE Leap 和 Red Hat Enterprise Linux 的文档明显是第一梯队,内容丰富且全面;Gentoo 和 Debian 的文档可以算做第二梯队吧,提供了部分说明但还不够完善;至于 Ubuntu 就差得有点远了。这也正是最初入坑 Arch Linux 的最大原因。
虽然 Kubuntu 的 Plasma 5.24 比 Arch Linux 落后了几个版本,但得益于 KDE Plasma 的高度可定制性,最终还是达到了近似的使用体验,希望接下来能够平稳过渡到 Kubuntu 吧。
附一张最终版本的 Kubuntu 桌面截图:KDE Plasma 5.24 in Kubuntu