前言
在雲計算領域,伺服器作為雲服務的基石,其重要性不言而喻,當今,雲數據中心部署伺服器規模達到百萬級,單機的功耗成功優化可以產生較大的經濟效益,而作業系統在節電和功耗優化對雲數據中心的節能有著重要的影響。
本文正是出於這個初衷,基於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接口
在該接口下存在如下通用性文件,按表格的形式整理如下:
ondemand接口
當配置 echo ondemand > /sys/devices/system/cpu/cpu0/scaling_governor下後,在/sys/devices/system/cpu/cpufreq/ 目錄下會增加一個ondemand目錄。
conservative接口
當配置 echo conservative > /sys/devices/system/cpu/cpu0/scaling_governor 下後,在/sys/devices/system/cpu/cpufreq/目錄下會增加一個conservative目錄。
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這塊後續還有很多功能點去挖掘、待實現,任重而道遠。