服务器功耗调节

服务器功耗调节

关于服务器的功耗问题的记录

随笔

我第一份运维工作时,公司有2台IBM的服务器放在办公室做ERP服务器。
刚入职不久就遇上了停电,好在有UPS,连忙去关机,后来一排查,发现是没电费了,赶紧联系公司行政去交电费。
充了500元,电费是民电,好像是5毛一度,以为能用很久,结果没到一个月又停电了。
后来就让行政去充一千,然后每隔一段时间去查一下电费。

我算了一下2台服务器,就差不多1千二百瓦,再加UPS和一个台式机,以及显示器交换机等,应该有1千600瓦,一天40度电,一个月1200度,一个月差不多600元。啧啧啧,相当于我当时半个月工资,吃了一惊。再后来听财务说公司旗下那个餐厅一个月电费就要3万,更是吓我一跳。

从此我就有些留意设备的功耗了。

服务器的功耗调整

我知道的主要有2个地方进行配置

方法一是 BIOS 内进行设置,主要就是选择CPU的性能模式和节能模式,还有风扇转速,不过一般不会去管风扇。

这个设置很有意义,我以前维护过一个惠普的刀箱,里面有16台刀片,主要跑的是java应用, 服务器CPU使用率日峰值在35%左右,有一次某主机关机维护,我到ILO管理界面去开机时,看到这些主机都是节能模式,突发奇想就把这一台机器改为了性能模式,开机后启动应用,第二天发现这台服务器CPU日峰值只有18%,基本上少了一半。
看了一下业务程序完全正常,我于是就去找惠普原厂小哥聊这个现象,他说性能模式就是性能更好,但是功耗高费电,别的没影响。
我问那为什么不出场就设定性能模式呢?
答: 主要是客户场景不一样,节能模式适配更通用,例如个别机房电源功率规划的问题,还有些客户就在意这个功耗等。

这我就知道了CPU的性能模式比节能模式要强很多,很多服务器优化案例都推荐开性能模式。

方法二是在操作系统上调整,内核提供了一个模块可以来做这个事情;

查看内核提供的CPU频率调整模块, 不同的CPU适用于不同模块

1
ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/

用户一般直接使用 cpupower 工具进行调整就行

实例

比如我的笔记本 CPU 是 i5-1135G7 @ 2.40GHz

标准情况下是 2.4GHz 的频率,此时CPU功耗一般,28瓦;
睿频最高可到 4.20GHz, 此时CPU功耗很高,持续时间不能太长就会降频
最低可以到 400MHz,此时功耗非常低,省电
官方说如果是 900MHz 的话,功耗就是12瓦

现在一般都是系统自动管理的,有任务时就增加CPU的可用频率,没复杂任务时就减少CPU的频率,从而降低功耗;

查看当前CPU的可用频率
现在没有什么任务在执行,可以看到有一个核心就只有 400MHz, 而且全部核心都低于 2.4GHz

1
2
3
4
5
6
7
8
9
[wait@wait-fedora ~]$ grep MHz /proc/cpuinfo
cpu MHz		: 545.292
cpu MHz		: 1060.289
cpu MHz		: 1100.000
cpu MHz		: 911.133
cpu MHz		: 975.920
cpu MHz		: 998.759
cpu MHz		: 400.000
cpu MHz		: 1017.391

执行此命令可以跟踪观察到频率是一直在变化的

1
watch -n 1 "cat /proc/cpuinfo | grep MHz"

倾向策略

虽然CPU可用频率是可以动态调整的,但是这也不是一点代价没有的;
因为增加频率时是有延迟的,而且不是立即增加到最高值,对于长期需要高频率CPU或者突然要求高频CPU的场景就不合适了。
于是我们可以将当前的能耗模式,设置为性能模式,也就是可用CPU频率始终维持在最高,于是应用程序执行时随时可以享用到最高频的计算资源。

几种模式简介

ondemand 均衡模式: 系统默认的模式,有效实现了动态频率调节
conservative 均衡模式: 相对于 ondemand 来说频率的调整会慢点,省电
interactive 性能优先: 优先走高频, 任务不繁忙时再慢慢降低
smartass 性能优先: 似乎比 interactive 模式调整频率时好一点
performance: 性能模式: 服务器平台直接上最高频,缓降速增
powersave: 节能模式: 缓增速降
userspace: 自定义模式: 由用户自己的程序来控制
Hotplug: 均衡模式: 据说会直接尝试关闭掉一颗CPU核心

我只试过 ondemand performance powersave 模式,其它没试过

查看当前的策略模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sudo cpupower frequency-info

analyzing CPU 1:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 400 MHz - 4.20 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 400 MHz and 4.20 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 1.20 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes

重点有2个地方
“hardware limits” 硬件支持的范围
“current policy” 当前的策略,里面有个关键字 “powersave”, 表示节能模式

调整模式

命令行直接修改方式

1
2
cpupower frequency-set -g performance     # 性能模式
cpupower frequency-set -g powersave       # 节能模式

也可以通过修改配置文件的方式,让 cpupower 服务来管理

1
2
3
4
[root@ser6 ~]# cat /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"      # 停止服务时设置的模式

systemctl start cpupower
systemctl enable cpupower

修改为性能模式

 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
[root@wait-fedora ~]# cpupower frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
Setting cpu: 4
Setting cpu: 5
Setting cpu: 6
Setting cpu: 7

# 查看修改后的信息
[root@wait-fedora ~]# cpupower frequency-info
analyzing CPU 2:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 2
  CPUs which need to have their frequency coordinated by software: 2
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 400 MHz - 4.20 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 400 MHz and 4.20 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 3.17 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes

# 可以看到大部分核心的可用CPU频率都增加了很多
[root@wait-fedora ~]# grep MHz /proc/cpuinfo
cpu MHz		: 2577.988
cpu MHz		: 400.000
cpu MHz		: 4200.596
cpu MHz		: 3225.769
cpu MHz		: 984.432
cpu MHz		: 2825.993
cpu MHz		: 400.000
cpu MHz		: 400.000

这个是在 fedora38 上进行的修改,我怀疑因为是笔记本CPU和桌面操作系统的原因,所以看起来不明显

于是我到我的 centos9 服务器主机上再验证一遍

服务器调整实例

 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
# 调整前数据和策略
[root@ser6 ~]# grep MHz /proc/cpuinfo
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 3153.803
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 3241.522
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000
cpu MHz		: 4829.000

# 此时是性能模式
[root@ser6 ~]# cpupower -c all frequency-info
analyzing CPU 0:
  driver: amd-pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 131 us
  hardware limits: 400 MHz - 4.83 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 400 MHz and 4.83 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 3.12 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    AMD PSTATE Highest Performance: 166. Maximum Frequency: 4.83 GHz.
    AMD PSTATE Nominal Performance: 110. Nominal Frequency: 3.20 GHz.
    AMD PSTATE Lowest Non-linear Performance: 38. Lowest Non-linear Frequency: 1.10 GHz.
    AMD PSTATE Lowest Performance: 14. Lowest Frequency: 400 MHz.

调整后数据和策略

 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
[root@ser6 ~]# cpupower frequency-set -g powersave

# 修改为节能模式后,频率下降很多
[root@ser6 ~]# cat /proc/cpuinfo | grep MHz
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 1085.072
cpu MHz		: 400.000
cpu MHz		: 400.000
cpu MHz		: 1085.120
cpu MHz		: 400.000
cpu MHz		: 400.000

[root@ser6 ~]# cpupower frequency-info
analyzing CPU 0:
  driver: amd-pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 131 us
  hardware limits: 400 MHz - 4.83 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 400 MHz and 4.83 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 1.08 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    AMD PSTATE Highest Performance: 166. Maximum Frequency: 4.83 GHz.
    AMD PSTATE Nominal Performance: 110. Nominal Frequency: 3.20 GHz.
    AMD PSTATE Lowest Non-linear Performance: 38. Lowest Non-linear Frequency: 1.10 GHz.
    AMD PSTATE Lowest Performance: 14. Lowest Frequency: 400 MHz.

功耗变化图

ser6功耗调整图

可以很清楚的看到这台设备的电源功耗变化,调整前空跑状态是15瓦-17瓦之间,调整后空跑是 4 瓦;

这可是一颗 AMD Ryzen 7 7735HS, 8C16T 最高 4.83 GHz 的CPU,现在才 4 瓦,比我另外一台低功耗的 j6412 的10瓦还要低。

如果不是长期的在线或实时业务,这种低功耗模式很有意义;

如果是服务器的话,非性能要求阶段开启节能模式应该能省更多电费。
以一台服务器800瓦,1元一度来算,一年要(800x24x365/1000)=7000元电费。

特别是我这种个人家庭实验环境(商电);
一个小时如果减少15W,一个月就省差不多16块钱(15x24x30/1000x1.5),
我还有好几台设备再加几块硬盘,粗略估算了一下,都走节能模式的话,一个月至少可以多出2包烟钱。
啧啧啧,省到即是赚到啦~

Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2024-01-01 00:00 UTC