Ubuntu 16.04 下 CPU 频率与功耗关系
硬件环境
实验服务器搭载两颗 Intel E5645 处理器,24块 SAS+SATA 机械硬盘。E5645 为 6 核处理器,并支持超线程技术(Intel® Hyper-Threading Technology),服务器共 24 个逻辑核,基本时钟频率为 2.40 GHz 。
软件环境
Ubuntu Server 16.04.1 LTS
CPU 频率驱动程序与工具
操作系统通过CPU调频可以根据负载动态调节CPU工作频率,达到省电的目的。这个过程可以自动进行,也可以由用户空间(userspace)程序手动调节。Linux 内核实现了CPU 调频,该驱动被称为 CPUfreq, 从 3.4 内核开始,内核会自动载入相应的内核模块,默认的频率调频器 ondemand 会被启动( Intel Sandy Bridge 架构后 CPU 的功率驱动程序为 P-State,默认调频器为 powersave )。用户调频工具有 cpufrequtils、 cpupower 等,这里使用 cpufrequtils 。
安装 cpufrequtils
包。
# apt install cpufrequtils
cpufrequtils 包包含以下三个工具,其中 cpufreq-info 用于查看cpu的相关信息,cpufreq-set 用于修改CPU的频率配置,cpufreq-aperf 用于计算一段时间内的平均频率。
/usr/bin/cpufreq-info
/usr/bin/cpufreq-set
/usr/bin/cpufreq-aperf
cpufreq-info 获得的信息包括:
dirver
: 实用的cpufreq内核驱动hardware limits
: 设定的cpu频率范围available frequency steps
: 可选的cpu频率available cpufreq governors
: 可选的cpu频率调速器:
调速器 | 描述 |
---|---|
ondemand | 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率(阙值为 95%) |
performance | 运行于最大频率 |
conservative | 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率(阙值为 75%) |
powersave | 运行于最小频率 |
userspace | 运行于用户指定的频率 |
current CPU frequency
: 当前的CPU频率cpufreq stats
: 统计cpu在每个频率下的工作时间
这些信息也可以手动在sysfs文件中查看,位置为 /sys/devices/system/cpu/cpuX/cpufreq/
chih@archlinux:/sys/devices/system/cpu/cpu0/cpufreq$ ls
affected_cpus related_cpus scaling_max_freq
bios_limit scaling_available_frequencies scaling_min_freq
cpuinfo_cur_freq scaling_available_governors scaling_setspeed
cpuinfo_max_freq scaling_cur_freq stats
cpuinfo_min_freq scaling_driver
cpuinfo_transition_latency scaling_governor
以上为CPU0的一些内核文件,前缀 cpuinfo 代表的是 cpu 硬件上支持的频率,而 scaling 前缀代表的是可以通过 CPUFreq 系统用软件进行调节时所支持的频率。cpuinfo_cur_freq 代表通过硬件实际上读到的频率值,而 scaling_cur_freq 则是软件当前的设置值,scaling_available_frequencies 表示当前软件支持的频率值,scaling_available_governors 表示当前软件支持的调频器,scaling_governor 表示当前使用的调频器,scaling_min_freq 与 scaling_max_freq 表示软件设置的最低频率与最高频率。scaling_set_speed 表示手动设置的特定频率。
cpufreq-set 允许用户手动设置CPU运行频率,相应的选项如下所示:
-
-c --cpu
number of CPU where cpufreq settings shall be modified. -
-d --min
new minimum CPU frequency the governor may select. -
-u --max
new maximum CPU frequency the governor may select. -
-g --governor
new cpufreq governor. -
-f --freq
specific frequency to be set. Requires userspace governor to be available and loaded. -
-r --related modify all hardware-related CPUs at the same time
-
-h --help Prints out the help screen.
因为服务器上核数比较多,可通过以下名为cpufreq-set-all
的shell脚本方便的设置全部CPU核。
#!/bin/bash
for i in {0..23}; do
cpufreq-set -c $i $@
done
-f 选项要求使用 userspace
调频器,使用下面的命令把所有CPU核的调频器都设置为 userspace 。
# cpufreq-set-all -g userspace
手动设定CPU的运行频率,注意,频率值必须是 scaling_available_frequencies
中列出的。
# cpufreq-set-all -f 2.0Ghz
负载
由于服务器无图形界面,使用了stress作为负载,stress 可以进行综合(内存占用、磁盘 IO)压力测试,可以反映典型用途下的服务器负载情况。
安装 stress
# aptitude install stress
产生24个cpu进程,对应服务器的总核数,可以确保100%跑满服务器CPU全部负载。
# stress -c 24
结果
如视频 1600Mhz.mp4、2000Mhz.mp4、2400Mhz.mp4 所示,实验选取了 1.6Ghz、2.0Ghz、2.4Ghz 三组CPU工作频率,对应的服务器整机功率如下表所示:
CPU频率 | CPU满载整机功率 | CPU空载整机功率 |
---|---|---|
1.6Ghz | 575W | 507W |
2.0Ghz | 612W | 519W |
2.4Ghz | 652W | 507W |
这里的功耗是整机功耗,受磁盘、主板等的功耗影响,其实可以通过 RAPL
单独读取 CPU 的功耗。