前言

CPU 动态节能技术用于降低服务器功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低服务器功耗,更低的功耗策略意味着 CPU 唤醒更慢对性能影响更大。对于对时延和性能要求高的应用,建议关闭 CPU 的动态调节功能,禁止 CPU 休眠,并把 CPU 频率固定到最高。通常建议在服务器 BIOS 中修改电源管理为 Performance,如果发现 CPU 模式为 conservative 或者 powersave,可以使用 cpupower 设置 CPU Performance 模式,效果也是相当显著的。

CPU 优化建议使用 cpupower 设置 CPU Performance 模式

更新历史

2019 年 07 月 17 日 - 更新 cpupower 自启动设置脚本
2019 年 01 月 18 日 - 初稿

阅读原文 - https://liaojiaxin158.github.io/post/cpupower/

扩展阅读

CPU frequency scaling - https://wiki.archlinux.org/index.php/CPU_frequency_scaling


cpufreq 的五种模式

cpufreq 是一个动态调整 cpu 频率的模块,系统启动时生成一个文件夹 / sys/devices/system/cpu/cpu0/cpufreq/,里面有几个文件,其中 scaling_min_freq 代表最低频率,scaling_max_freq 代表最高频率,scalin_governor 代表 cpu 频率调整模式,用它来控制 CPU 频率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
cd /sys/devices/system/cpu/cpu0/cpufreq/

affected_cpus
bios_limit
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
cpuinfo_transition_latency
freqdomain_cpus
related_cpus
scaling_available_frequencies
scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed

# 查看当前的调节器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
conservative

# 查看频率信息
cpupower frequency-info

analyzing CPU 0:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 10.0 us
hardware limits: 800 MHz - 2.10 GHz
available frequency steps: 2.10 GHz, 2.10 GHz, 2.00 GHz, 1.90 GHz, 1.80 GHz, 1.70 GHz, 1.60 GHz, 1.50 GHz, 1.40 GHz, 1.30 GHz, 1.20 GHz, 1.10 GHz, 1000 MHz, 900 MHz, 800 MHz
available cpufreq governors: conservative userspace powersave ondemand performance
current policy: frequency should be within 800 MHz and 2.10 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 2.10 GHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes
  1. performance: 顾名思义只注重效率,将 CPU 频率固定工作在其支持的最高运行频率上,而不动态调节。
  2. Userspace: 最早的 cpufreq 子系统通过 userspace governor 为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节 CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
  3. powersave: 将 CPU 频率设置为最低的所谓 “省电” 模式,CPU 会固定工作在其支持的最低运行频率上。因此这两种 governors 都属于静态 governor,即在使用它们时 CPU 的运行频率不会根据系统运行时负载的变化动态作出调整。这两种 governors 对应的是两种极端的应用场景,使用 performance governor 是对系统高性能的最大追求,而使用 powersave governor 则是对系统低功耗的最大追求。
  4. ondemand: 按需快速动态调整 CPU 频率, 一有 cpu 计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率;ondemand:userspace 是内核态的检测,用户态调整,效率低。而 ondemand 正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的 governor。 在 ondemand governor 监测到系统负载超过 up_threshold 所设定的百分比时,说明用户当前需要 CPU 提供更强大的处理能力,因此 ondemand governor 会将 CPU 设置在最高频率上运行。但是当 ondemand governor 监测到系统负载下降,可以降低 CPU 的运行频率时,到底应该降低到哪个频率呢? ondemand governor 的最初实现是在可选的频率范围内调低至下一个可用频率,例如 CPU 支持三个可选频率,分别为 1.67GHz、1.33GHz 和 1GHz ,如果 CPU 运行在 1.67GHz 时 ondemand governor 发现可以降低运行频率,那么 1.33GHz 将被选作降频的目标频率。
  5. conservative: 与 ondemand 不同,平滑地调整 CPU 频率,频率的升降是渐变式的, 会自动在频率上下限调整,和 ondemand 的区别在于它会按需分配频率,而不是一味追求最高频率;

cpupower 设置 performance

从 conservative 或者 powersave 切换到 performance 的效果还是杠杠的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# CentOS 安装 kernel-tools
yum install kernel-tools

# Ubuntu 安装 CPU 模式无图形化切换器
apt install cpufrequtils

# cpupower 设置 performance
cpupower frequency-set -g performance

# 查看当前的调节器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

# 创建 cpupower 配置文件
cat << EOF | sudo tee /etc/sysconfig/cpupower
# See 'cpupower help' and cpupower(1) for more info
CPUPOWER_START_OPTS="frequency-set -g performance"
CPUPOWER_STOP_OPTS="frequency-set -g ondemand"
EOF

# 创建自启动服务
cat << EOF | sudo tee /usr/lib/systemd/system/cpupower.service
[Unit]
Description=Configure CPU power related settings
After=syslog.target

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/sysconfig/cpupower
ExecStart=/usr/bin/cpupower $CPUPOWER_START_OPTS
ExecStop=/usr/bin/cpupower $CPUPOWER_STOP_OPTS

[Install]
WantedBy=multi-user.target
EOF

# 刷新 system 服务
systemctl daemon-reload
systemctl enable cpupower.service

# systemd.service — Service unit configuration
https://www.freedesktop.org/software/systemd/man/systemd.service.html

无法使用 cpupower 调整 performance

比如我们遇到相同类型 CPU 硬件和操作系统版本,但不同厂商会出现无法使用 cpupower 调整 performance 的情况

Dell R440 CPU: Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz Failed

Dell R430 CPU: Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz Success

Huawei 1288H V5 CPU: Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz Success

1
2
3
4
5
6
7
8
9
10
# 如果遇到以下报错请确认硬件厂商是否做了限制,只能通过 BIOS 调节
[root@sg-gop-10-71-14-91 wangao]# cpupower frequency-set -g performance
Setting cpu: 0
Error setting new values. Common errors:
- Do you have proper administration rights? (super-user?)
- Is the governor you requested available and modprobed?
- Trying to set an invalid policy?
- Trying to set a specific frequency, but userspace governor is not available,
for example because of hardware which cannot be set to a specific frequency
or because the userspace governor isn't loaded?

参考文章

CPU frequency and voltage scaling code in the Linux(TM) kernel
POWER MANAGEMENT GUIDE

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. cpufreq 的五种模式
  4. 4. cpupower 设置 performance
  5. 5. 无法使用 cpupower 调整 performance
  6. 6. 参考文章