功耗与性能系列之DVFS功能特性介绍
前言
在云计算领域,服务器作为云服务的基石,其重要性不言而喻,当今,云数据中心部署服务器规模达到百万级,单机的功耗成功优化可以产生较大的经济效益,而操作系统在节电和功耗优化对云数据中心的节能有着重要的影响。
本文正是出于这个初衷,基于linux内核中现成的DVFS技术,进行了一次功耗与性能方面的探索。
什么是DVFS
DVFS全称Dynamic Voltage and Frequency Scaling,即动态电压频率调整。这项技术可以根据芯片运行的应用程序的计算需求,动态调整电压和频率,在不需要高性能时,降低电压和频率,以降低功耗;在需要高性能时,提高电压和频率,以提高性能,从而达到兼顾性能而又节能的目的。
DVFS支持的策略
目前DVFS支持调频调压策略主要包含如下几种:
ondemand 系统负载小时以低频率运行,系统负载提高时按需提高频率
conservative 跟ondemand方式类似, 不同之处在于提高频率时渐进提高
performance cpu按照支持的最高频率运行
powersave cpu以支持的最低频率运行
userspace 使用用户在/sys 节点scaling_setspeed设置的频率运行。
DVFS实现情况
软件实现
内核目前有一套完整的代码支持DVFS,具体可参考内核下drivers/cpufreq/。
1.提供用户态/sys接口,支持不同DVFS策略的配置
2.cpufreq driver驱动实现不同的频率、电压配置的硬件接口
3.cpufreq_policy支持不同策略的实现
4.cpufreq_governor不同策略具体实现方式
5.cpufreq_core 将上层调用、driver以及各governor融合在一起。
注:上图中kernel中箭头方向并非一定正确,只是为了表示cpufreq各子模块错综复杂的关系罢了。
用户态工具
cpufrequtils是一种可查看、可配置、可测试的DVFS工具,其主要包含cpufreq-info, cpufreq-set,cpufreq-bench三个部分,其中cpufreq-info是查看功能,用于查看cpu DVFS相关信息,cpufreq-set是配置工具,用于对cpu进行dvfs设置,cpufreq-bench是benchmark测试工具,用于不同策略下的性能测试。目前cpufrequtils已合入内核,可在tools/power/cpupower/下获取。
DVFS用户态接口介绍
cpufreq相关驱动模块加载后,会在各cpu下创建:/sys/devices/system/cpu/cpuX/cpufreq接口,cpufreq该接口是通过软链接:/sys/devices/system/cpu/cpufreq而来。
cpufreq接口
在该接口下存在如下通用性文件,按表格的形式整理如下:
id | means |
affected_cpus | 关联的CPU,表示其中任何cpu频率变化都跟着变化 |
cpuinfo_cur_freq | 当前cpu使用频率 |
cpuinfo_max_freq | 当前cpu支持的最大频率 |
cpuinfo_min_freq | 当前cpu支持的最小频率 |
cpuinfo_transition_latency | 频率切换时,支持的时延 |
related_cpus | 相关联的cpu,仅显示online |
scaling_available_governors | 可用的调频策略 |
scaling_cur_freq | 当前频率 |
scaling_driver | 采用的驱动 |
scaling_governor | 当前调频策略 |
scaling_max_freq | 支持的最大频率,不包含cpu turbo情况 |
scaling_min_freq | 支持的最小频率 |
scaling_setspeed | 设置频率,仅在userspace下使用 |
ondemand接口
当配置 echo ondemand > /sys/devices/system/cpu/cpu0/scaling_governor下后,在/sys/devices/system/cpu/cpufreq/ 目录下会增加一个ondemand目录。
id | means |
ignore_nice_load | 是否忽略nice的load影响 |
io_is_busy | io_is_busy:这个参数决定是否根据设备的存储有关的 I/Obusy情况修改频率 |
powersave_bias | 考虑功耗情况下,增加的频率打个折 |
sampling_down_factor | 控制cpu降频的频率,当设置成1(缺省值),则根据每个采样间隔决定,如果值大于1,作为cpu调频间隔的乘积因子。 |
sampling_rate | 采样频率 |
up_threshold | load上限值 |
conservative接口
当配置 echo conservative > /sys/devices/system/cpu/cpu0/scaling_governor 下后,在/sys/devices/system/cpu/cpufreq/目录下会增加一个conservative目录。
id | means |
down_threshold | 下限值 |
freq_step | 频率增加步进值 |
ignore_nice_load | 是否忽略nice的load影响 |
sampling_down_factor | 控制cpu降频的频率,当设置成1(缺省值),则根据每个采样间隔决定,如果值大于1,作为cpu调频间隔的乘积因子。 |
sampling_rate | 采样频率设置 |
up_threshold | 上限值 |
DVFS之ondmand调频算法实现
相比conservative调频方式较为“激进”, 所以在调频过程中,性能恢复快速,在不考虑性能抖动等问题时,追求低时延场景,ondemand降频相比conservative调频,更具有优势。
实现原理
算法实现:
load =100 (time_elapsed - idle_time) / time_elapsed;
freq_next = min_f + load (max_f - min_f) / 100; if load <= up_threshold
freq_next = max_f if load > up_threshold
time_elapsed: 此处可以理解为总的时间
idle_time:time_elapsed时间内cpu idle时长。
up_threshold:load上限阈值,若load > up_threshold则表示需要升频,则直接升频到所支持的最大频率,若load <= up_threshold,则按照第三行公式,增加或减少频率。
此外还增加了ignore_nice_load、io_is_busy、powersave_bias、sampling_down_factor四个辅助参数调频,ignore_nice_load表示是否忽略nice变化对load造成的影响,io_is_busy表示是否idle中考虑io wait的影响;
sampling_down_factor表示弥补采样过程中对造成的load测量值偏差,powersave_bias表示在考虑节能的情况下,load > up_threshold时,不直接升频到最大频率。
DVFS之conservative调频算法实现
相比ondemand,conservative调频方式较为“柔和”, 采用这种降频特性的目的就在尽量减少降频过程中对系统性能的影响,例如性能抖动问题,从而不影响程序对用户造成的不良体验。
实现原理
算法实现:
load =100 (time_elapsed - idle_time) / time_elapsed;
freq_step’ = freq_step * max_freq / 100
freq_next = cur_freq - freq_step’ if load < down_threshold
freq_next = cur_freq + freq_step’ if load > up_threshold
time_elapsed: 此处可以理解为总的时间
idle_time:time_elapsed时间内cpu idle时长。
freq_step:频率增加步长。
down_threshold:load下限阈值,若load小于down_threshold,则表示需要降频。
up_threshold:load上限阈值,若load > up_threshold则表示需要升频。
从算法实现来看,conservative不受采样频率的影响,主要可调参数是down_threshold、up_threshold、freq_step三个参数,此外增加了ignore_nice_load、sampling_down_factor两个辅助调频参数,ignore_nice_load表示忽略nice对load造成的影响,sampling_down_factor可以理解为弥补采样过程中对造成的load测量值偏差。
DVFS benchmark测试情况
采用cpufrequtils工具中的cpufreq-bench进行性能测试,通过调节不同load情况下,conservative、ondmand、userspace三种调频策略下的性能情况。
图一:横坐标:load时间 纵坐标:对比perfmance模式下性能百分占比。
从图中可以看出:
powersave性能下降最为明显,并且不随load的变化而变化,虽然该策略下功耗节省最大但是明显无法满足需要高性能的场景。
conservative性能下降区间较大,降幅相对平稳,不易引起性能抖动,正好体现其'柔和'之意,但其缺点也很明显,由于是频率是逐步提升的,对于突发要求高性能的场景,是无法做到及时响应的。
受调参的影响,ondemand测试的性能下降区间不够明显,但是从曲线可以看出,其降幅迅速,适用于对于快速响应、低时延的场景。
performance情况,不论load怎么变化,相比其他调频测试,性能肯定是最优的,但是若需要考虑功耗的场景,performance调频测试也是满足不了要求的。
功耗对比测试
采用stress测试工具,指定cpu数目为128,通过ipmi获取整机功率,此处默认整机除stress外并无跑其他业务程序,stress测试时设置load从5到100,step为5,分别测试performance、ondemand、conservative、powersave四种调频策略下的功耗情况。
图中横坐标表示负载load,纵坐标表示功率watt。
结论
从图中可以看出:
1、功耗performance > ondemand > conservative >powersave,其中ondemand、conservative功耗相比performance下降并不明显,个人认为是受可调参数的影响,若优化可调参数,肯定会有更低的降幅。此外本次测试,cpufreq policy并非单cpu控制,而是die方式,即一组cpu共用policy, 这就可能导致在dvfs调频时,会出现因单个cpu load增加过大,DVFS将其die所相关的cpu的频率均升高的现象,从而功耗下降不明显。
2、设置powersave调频策略时,可以看出功率有明显的降幅,最高降幅达到-8%,笔者在没有执行stress测试前,功率降幅达到-10%以上,说明在功耗这块,通过DVFS方式,是有潜力达到兼顾性能又能节省功耗的目的。
后记
从本文的测试情况,DVFS对于功耗和性能平衡把控并非那么完善,要达到兼顾性能而又降低功耗的目的,需要根据实际的应用场景,去做更多的适配和优化,但是怎样定义目前处于高性能需求或低性能阶段,以及不同阶段,需要调节的频率和电压范围是多少,在实际生产应用中,这些都有待去研究和分析,所以DVFS这块后续还有很多功能点去挖掘、待实现,任重而道远。
往期精彩回顾
1、入选高性能计算著名顶会SC20长论文!详解阿里“Alita”
2、阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版
3、你认为 io_uring 只适用于存储 IO?大错特错!
4、面对疾风吧!io_uring 优化 nginx 实战演练
欢迎钉钉扫码入群交流: