前言

功耗与性能系列之DVFS功能特性介绍_Linux

在云计算领域,服务器作为云服务的基石,其重要性不言而喻,当今,云数据中心部署服务器规模达到百万级,单机的功耗成功优化可以产生较大的经济效益,而操作系统在节电和功耗优化对云数据中心的节能有着重要的影响。

本文正是出于这个初衷,基于linux内核中现成的DVFS技术,进行了一次功耗与性能方面的探索。

什么是DVFS

功耗与性能系列之DVFS功能特性介绍_Linux

DVFS全称Dynamic Voltage and Frequency Scaling,即动态电压频率调整。这项技术可以根据芯片运行的应用程序的计算需求,动态调整电压和频率,在不需要高性能时,降低电压和频率,以降低功耗;在需要高性能时,提高电压和频率,以提高性能,从而达到兼顾性能而又节能的目的。

DVFS支持的策略

功耗与性能系列之DVFS功能特性介绍_Linux

目前DVFS支持调频调压策略主要包含如下几种:

  1. ondemand 系统负载小时以低频率运行,系统负载提高时按需提高频率

  2. conservative 跟ondemand方式类似, 不同之处在于提高频率时渐进提高

  3. performance cpu按照支持的最高频率运行

  4. powersave cpu以支持的最低频率运行

  5. userspace 使用用户在/sys 节点scaling_setspeed设置的频率运行。


DVFS实现情况

功耗与性能系列之DVFS功能特性介绍_Linux

软件实现

内核目前有一套完整的代码支持DVFS,具体可参考内核下drivers/cpufreq/。


功耗与性能系列之DVFS功能特性介绍_Linux_05

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接口

在该接口下存在如下通用性文件,按表格的形式整理如下:


idmeans
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目录。


idmeans

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目录。


idmeans

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_thresholdfreq_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 / 100freq_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三种调频策略下的性能情况。


功耗与性能系列之DVFS功能特性介绍_Linux_06


图一:横坐标:load时间 纵坐标:对比perfmance模式下性能百分占比。


从图中可以看出:


  • powersave性能下降最为明显,并且不随load的变化而变化,虽然该策略下功耗节省最大但是明显无法满足需要高性能的场景。

  • conservative性能下降区间较大,降幅相对平稳,不易引起性能抖动,正好体现其'柔和'之意,但其缺点也很明显,由于是频率是逐步提升的,对于突发要求高性能的场景,是无法做到及时响应的。

  • 受调参的影响,ondemand测试的性能下降区间不够明显,但是从曲线可以看出,其降幅迅速,适用于对于快速响应、低时延的场景。

  • performance情况,不论load怎么变化,相比其他调频测试,性能肯定是最优的,但是若需要考虑功耗的场景,performance调频测试也是满足不了要求的。


功耗对比测试

功耗与性能系列之DVFS功能特性介绍_Linux

采用stress测试工具,指定cpu数目为128,通过ipmi获取整机功率,此处默认整机除stress外并无跑其他业务程序,stress测试时设置load从5到100,step为5,分别测试performance、ondemand、conservative、powersave四种调频策略下的功耗情况。


图中横坐标表示负载load,纵坐标表示功率watt。


功耗与性能系列之DVFS功能特性介绍_Linux_08

结论

功耗与性能系列之DVFS功能特性介绍_Linux

从图中可以看出:


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功能特性介绍_Linux

从本文的测试情况,DVFS对于功耗和性能平衡把控并非那么完善,要达到兼顾性能而又降低功耗的目的,需要根据实际的应用场景,去做更多的适配和优化,但是怎样定义目前处于高性能需求或低性能阶段,以及不同阶段,需要调节的频率和电压范围是多少,在实际生产应用中,这些都有待去研究和分析,所以DVFS这块后续还有很多功能点去挖掘、待实现,任重而道远。