Ubuntu HWE Kernel 与 Linux CPU Frequency Scaling

其实 HWE Kernel 和 Frequency Scaling 是两个东西,只不过频率调节的工具是 Kernel 里面的一个组件,我因为没找到对应的 meta-package 而没有安装上正确的版本,然后发现是 HWE Kernel 和 GA Kernel 的不同版本造成的,所以想着干脆一起写篇东西解释一下这些东西的不同。

HWE Kernel

首先要说一说的是 HWE Kernel,按照官网的说法,是为了让 LTS 的 Linux 系统能够迅速支持最新的硬件,所以才命名为 HWE (HardWare Enable)。实际在使用过程中,可能也是我经验不足的原因,没碰上什么硬件太新 Kernel 不支持造成的 bug,所以这个名字怎么定义的其实意义不大。

在使用 Ubuntu 的过程中,应该都会遇到这样一种情况,Ubuntu 会帮我们自动更新内核,在 LTS 版本的 Roadmap 中,我们也可以看到不同的 point release 对应了不同的内核版本,比如 16.04.4 LTS 对应的就是 4.13 的内核。但有的时候,我们会发现,明明自己的系统已经是 16.04.4,为什么内核还是 4.4 版本呢?这是因为 HWE kernel 和 4.4 这样长期支持的 GA Kernel 其实是两个 meta-package,GA Kernel 对应的包是 linux-generic,下有 linux-image-generic 和 linux-headers-generic 这两个包,再往下才是具体的内核包。如果想要跟随 point release 更新系统的内核,那么就应该安装对应的 HWE 内核,HWE 内核是和 LTS 版本绑定的,比如 16.04 就需要加上 -hwe-16.04 后缀,那么对应的内核包就是 linux-generic-hwe-16.04,下面的包是 linux-headers-generic-hwe-16.04 和 linux-image-generic-hwe-16.04。使用这个包,就能安装最新的 4.13 内核(LTS 16.04.04)。

除了普通的 HWE 内核之外,还有一个更加激进的更新版本是 Rolling HWE Stacks,将上面的 -hwe-16.04 换成 -hwe-16.04-edge 就可以使用到这个 Stack。在这个 Stack 中可以提前使用 下一个 point release 中使用的 HWE 内核版本,就有点类似于 beta 测试的分支,这个可能会存在一定的稳定性问题,所以是否使用请自行斟酌。

CPU Frequency Scaling

接下来要说一说的是 CPU 频率调节的问题,在 Windows 上很多人应该都使用过的一个功能是电源方案,里面对 CPU 的最大频率、最小频率,散热方式等等可以做出一些自定义设置,Linux 上同样也提供了这样的功能。

在 Arch Wiki 中,对于这个问题有比较详细的介绍,在这里就简单地说一说:Linux 内核有自己的 CPU 调频实现,称为 cpufreq,这个在 3.4 的内核之后,必要的模块都会自行加载,用户也可以通过一些工具实现自己的调节。

CPU 频率的驱动程序随着 CPU 型号的不同会有很多的版本,具体可以查看 Arch Wiki 上面的说明,对于现在使用的 SandyBridge 以后架构的 CPU,通常使用 intel_pstate 来对频率进行调节。可以通过如下命令来查看 pstate 是否已经启用:

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver

如果显示的都是 intel_pstate,那么你的 CPU 调节使用的就是 p-state 驱动。

CPU 频率的手动调节通常使用 cpupower 这个工具,可以通过如下的命令安装(需要和内核版本一直,这里使用 HWE Kernel 对应的版本):

$ sudo apt-get install linux-tools-common linux-tools-generic-hwe-16.04

之后运行 $ cpupower frequency-info就可以看到 CPU 的信息,大概是这样的输出:

$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 1.60 GHz - 3.90 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 1.60 GHz and 3.90 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 3.70 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    3700 MHz max turbo 4 active cores
    3800 MHz max turbo 3 active cores
    3900 MHz max turbo 2 active cores
    3900 MHz max turbo 1 active cores

可以发现,信息比我们从 Windows 上面获取的要多得多,不仅可以看到当前的频率,还能看到最大睿频的信息。

Scaling Governors

Scaling Governor 相当于预设的 CPU 电源方案,在文档中有 6 种不同的调速器,但是在实际使用中,通常只有 performance 和 powersave 两种。performance 相当与强制 CPU 运行在最高频率,而 powersave 可以让 CPU 按需自动调节频率。当前在使用的调速器可以通过如下命令查看:

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

通常来说默认配置是 powersave 模式,如果想调整为 performance,可以执行如下的命令:

$ sudo cpupower frequency-set -g performance

之后再进行查看,应该就是 performance 模式了,CPU 也会被固定在最大睿频上。

固定 Governor 不被修改

直接使用 cpupower 修改之后会存在一个问题,重启之后会被修改回 powersave,可以安装 cpufrequtils 将其固定:

$ sudo apt-get install cpufrequtils
$ sudo systemctl disable ondemand

一定要将 ondemand 这个服务关闭,这个服务会将 governor 设置为 ondemand 模式,但是通常 CPU 都不支持这个模式,然后就会 fallback 到 powersave。

之后在/etc/default/cpufrequtils中添加GOVERNOR="performance",重启即可。

Reference

https://wiki.archlinux.org/index.php/CPU_frequency_scaling_(简体中文)

https://wiki.ubuntu.com/Kernel/LTSEnablementStack

https://wiki.ubuntu.com/Kernel/RollingLTSEnablementStack

http://www.webupd8.org/2014/04/prevent-your-laptop-from-overheating.html

发表评论

电子邮件地址不会被公开。