Ubuntu解锁睿频限制

根据公司相关要求,把自己的主机换成了公司的笔记本。在 Windows 11 上测试了 Hyper-V 虚拟机和 WSL 2,感觉使用 vscode remote 搭建开发环境还是不太方便。
与相关部门进行沟通后,确认公司允许使用 Ubuntu Desktop 作为本地开发环境,于是将笔记本重装为 Kubuntu,期望能接近在 Arch Linux 上的 KDE 使用体验。
测试 Kubuntu 的过程中发现笔记本 CPU 的最大频率明显比 Windows 11 上的低,因此尝试排查具体原因,寻找解决办法。

硬件信息

kubuntu_neofetch

问题描述

在 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 下测试时明显。

kubuntu_htop_1

原因分析

刚拿到笔记本时就翻了一遍 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 查看和修改。

kubuntu_cpufreq

Scaling governors

如果使用的是 intel_pstate 驱动程序,那么就只有 powersaveperformance 两个方案可选,且默认方案为 powersave。两个方案都是动态调频,但侧重点不同。

再次使用 stress-ng --cpu 2 --timeout 30 命令跑满双核进行测试,发现 CPU 频率达到预期:

kubuntu_htop_2

Userspace tools

ArchWiki 这边列举了很多工具,例如 thermaldcpupowerpower-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-clientmysql-server 的通用依赖,因此尝试使用 apt-cache rdepends linux-tools-common 查找反向依赖,最终递归查找到了 linux-tools-generic-hwe-22.04

kubuntu_apt_rdepends

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

kubuntu_frequency_info

参考 Arch Linux 上的 cpupower 软件包补充了 /etc/systemd/system/cpupower.service,随后执行 systemctl daemon-reloadsystemctl 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 的过程中找到了挺多发行版的说明文档,例如:

对比下来 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