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