Linux2.6內核中的最新電源管理技術(shù)綜述
前言
本文引用地址:http://dyxdggzs.com/article/201612/327535.htm本系列文章將結合近年來(lái)不斷在各種硬件(包括 CPU、芯片組、PCI Express 等各種最新總線(xiàn)標準以及外設)上新增的節能技術(shù)。
從 Linux? 2.6內核及整個(gè) software stack (包括 kernel、middleware 以及各種用戶(hù)態(tài) utility)如何添加對這些創(chuàng )新的節能技術(shù)的支持這一角度,為讀者介紹 Linux 操作系統近幾年來(lái)在電源管理方面所取得的長(cháng)足進(jìn)步以及未來(lái)的發(fā)展方向。
作為本系列文章的開(kāi)篇之作,首先要向大家介紹的是 cpufreq,它是 Linux 2.6內核為了更好的支持近年來(lái)在各款主流CPU 處理器中出現的變頻技術(shù)而新增的一個(gè)內核子系統。
Cpufreq 的由來(lái)
隨著(zhù) energy efficient computing 和 performance per watt 等概念的推廣以及高級配置與電源接口A(yíng)CPI(Advanced Configuration and Power Interface)標準的發(fā)展,目前市場(chǎng)上的主流 CPU 都提供了對變頻(frequency scaling)技術(shù)的支持。例如Intel?處理器所支持的 Enhanced SpeedStep? 技術(shù)和 AMD? 處理器所支持的 PowerNow! ? 技術(shù),另外像最新的PowerPC?、ARM?、SPARC? 和 SuperH? 等處理器中也提供了類(lèi)似的支持。參考資料中列出了當前 Linux 2.6內核所支持的具備變頻技術(shù)的處理器。需要注意的是,這里要討論的變頻技術(shù)與大家以前所熟知的超頻是兩個(gè)不同的概念。超頻是指通過(guò)提高核心電壓等手段讓處理器工作在非標準頻率下的行為,這往往會(huì )造成 CPU 使用壽命縮短以及系統穩定性下降等嚴重后果。
而變頻技術(shù)是指CPU硬件本身支持在不同的頻率下運行,系統在運行過(guò)程中可以根據隨時(shí)可能發(fā)生變化的系統負載情況動(dòng)態(tài)在這些不同的運行頻率之間進(jìn)行切換,從而達到對性能和功耗做到二者兼顧的目的。
雖然多個(gè)處理器生產(chǎn)廠(chǎng)家都提供了對變頻技術(shù)的支持,但是其硬件實(shí)現和使用方法必然存在著(zhù)細微甚至巨大的差別。這就使得每個(gè)處理器生產(chǎn)廠(chǎng)家都需要按照其特殊的硬件實(shí)現和使用方法向內核中添加代碼,從而讓自己產(chǎn)品中的變頻技術(shù)在 Linux 中得到支持和使用。然而,這種內核開(kāi)發(fā)模式所導致的后果是各個(gè)廠(chǎng)家的實(shí)現代碼散落在 Linux 內核代碼樹(shù)的各個(gè)角落里,各種不同的實(shí)現之間沒(méi)有任何代碼是共享的,這給內核的維護以及將來(lái)添加對新的產(chǎn)品的支持都帶來(lái)了巨大的開(kāi)銷(xiāo),并直接導致了 cpufreq 內核子系統的誕生。實(shí)際上,正如前文所說(shuō),發(fā)明變頻技術(shù)的目的是為了能夠讓系統在運行過(guò)程中隨時(shí)根據系統負載的變化動(dòng)態(tài)調整 CPU 的運行頻率。這件事情可以分為兩個(gè)部分,一部分是“做什么”的問(wèn)題,另一部分是“怎么做”的問(wèn)題?!白鍪裁础笔侵溉绾胃鶕到y負載的動(dòng)態(tài)變化挑選出 CPU 合適的運行頻率,而“怎么做”就是要按照選定的運行頻率在選定的時(shí)間對 CPU 進(jìn)行設置,使之真正工作在這一頻率上。這也就是我們在軟件設計中經(jīng)常會(huì )遇到的機制 mechanism 與策略 policy 的問(wèn)題,而設計良好的軟件會(huì )在架構上保證二者是被清晰的隔離開(kāi)的并通過(guò)規范定義的接口進(jìn)行通信。
Cpufreq 的設計和使用
為了解決前文所提到的問(wèn)題,一個(gè)新的內核子系統—— cpufreq 應運而生了。Cpufreq 為在Linux 內核中更好的支持不同 CPU 的變頻技術(shù)提供了一個(gè)統一的設計框架,其軟件結構如圖 1 所示。
圖 1. Cpufreq 的軟件結構
如圖 1 所示,cpufreq 在設計上主要分為以下三個(gè)模塊:
Cpufreq 模塊(cpufreq module)對如何在底層控制各種不同CPU 所支持的變頻技術(shù)以及如何在上層根據系統負載動(dòng)態(tài)選擇合適的運行頻率進(jìn)行了封裝和抽象,并在二者之間定義了清晰的接口,從而在設計上完成了前文所提到的對 mechanism 與policy 的分離。
在 cpufreq 模塊的底層,各個(gè)CPU 生產(chǎn)廠(chǎng)商只需根據其變頻技術(shù)的硬件實(shí)現和使用方法提供與其 CPU 相關(guān)的變頻驅動(dòng)程序(CPU-specific drivers),例如 Intel 需要提供支持Enhanced SpeedStep 技術(shù)的 CPU 驅動(dòng)程序,而 AMD 則需要提供支持 PowerNow! 技術(shù)的 CPU 驅動(dòng)程序。
在 cpufreq 模塊的上層,governor 作為選擇合適的目標運行頻率的決策者,根據一定的標準在適當的時(shí)刻選擇出 CPU 適合的運行頻率,并通過(guò) cpufreq 模塊定義的接口操作底層與 CPU 相關(guān)的變頻驅動(dòng)程序,將 CPU 設置運行在選定的運行頻率上。
目前最新的 Linux 內核中提供了 performance 、powersave 、userspace、conservative 和 ondemand 五種 governors 供用戶(hù)選擇使用,它們在選擇 CPU 合適的運行頻率時(shí)使用的是各自不同的標準并分別適用于不同的應用場(chǎng)景。用戶(hù)在同一時(shí)間只能選擇其中一個(gè) governor 使用,但是可以在系統運行過(guò)程中根據應用需求的變化而切換使用另一個(gè) governor 。
這種設計帶來(lái)的好處是使得 governor 和 CPU 相關(guān)的變頻驅動(dòng)程序的開(kāi)發(fā)可以相互獨立進(jìn)行,并在最大限度上實(shí)現代碼重用,內核開(kāi)發(fā)人員在編寫(xiě)和試驗新的 governor 時(shí)不會(huì )再陷入到某款特定 CPU 的變頻技術(shù)的硬件實(shí)現細節中去,而 CPU 生產(chǎn)廠(chǎng)商在向 Linux 內核中添加支持其特定的 CPU 變頻技術(shù)的代碼時(shí)只需提供一個(gè)相對來(lái)說(shuō)簡(jiǎn)單了很多的驅動(dòng)程序,而不必考慮在各種不同的應用場(chǎng)景中如何選擇合適的運行頻率這些復雜的問(wèn)題。
內核中的 cpufreq 子系統通過(guò) sysfs 文件系統向上層應用提供了用戶(hù)接口,對于系統中的每一個(gè) CPU 而言,其 cpufreq 的 sysfs 用戶(hù)接口位于 /sys/devices/system/cpu/cpuX/cpufreq/ 目錄下,其中 X 代表 processor id ,與 /proc/cpuinfo 中的信息相對應。以cpu0 為例,用戶(hù)一般會(huì )在該目錄下觀(guān)察到以下文件:
$ ls -F /sys/devices/system/cpu/cpu0/cpufreq/
affected_cpus
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
ondemand/
scaling_available_frequencies
scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
stats/
這其中的所有可讀文件都可以使用 cat 命令進(jìn)行讀操作,另外所有可寫(xiě)文件都可以使用 echo 命令進(jìn)行寫(xiě)操作。其中cpuinfo_max_freq 和 cpuinfo_min_freq 分別給出了CPU 硬件所支持的最高運行頻率及最低運行頻率, cpuinfo_cur_freq 則會(huì )從 CPU 硬件寄存器中讀取 CPU 當前所處的運行頻率。雖然 CPU 硬件支持多種不同的運行頻率,但是在有些場(chǎng)合下用戶(hù)可以只選擇使用其中的一個(gè)子集,這種控制是通過(guò)scaling_max_freq 和 scaling_min_freq 進(jìn)行的。Governor在選擇合適的運行頻率時(shí)只會(huì )在 scaling_max_freq 和scaling_min_freq 所確定的頻率范圍內進(jìn)行選擇,這也就是scaling_available_frequencies 所顯示的內容。與cpuinfo_cur_freq 不同, scaling_cur_freq 返回的是cpufreq 模塊緩存的 CPU 當前運行頻率,而不會(huì )對 CPU 硬件寄存器進(jìn)行檢查。 scaling_available_governors 會(huì )告訴用戶(hù)當前有哪些 governors 可供用戶(hù)使用,而 scaling_driver 則會(huì )顯示該 CPU 所使用的變頻驅動(dòng)程序。 Stats 目錄下給出了對 CPU 各種運行頻率的使用統計情況,例如 CPU 在各種頻率下的運行時(shí)間以及在各種頻率之間的變頻次數。 Ondemand 目錄則與 ondemand governor 相關(guān),在后文會(huì )進(jìn)行相應的介紹。
通過(guò)以上的介紹,大家對如何使用 cpufreq 通過(guò) sysfs 提供的用戶(hù)接口已經(jīng)有了大致的了解,但是對于絕大部分用戶(hù)而言,逐一操作這些文件既費力又耗時(shí)。因此 Dominik 等人開(kāi)發(fā)了cpufrequtils 工具包[2],為用戶(hù)提供了更加簡(jiǎn)便的對內核cpufreq 子系統的操作接口。通過(guò) cpufreq-info 的輸出,讀者可以很清楚的看到剛剛在上面介紹過(guò)的/sys/devices/system/cpu/cpuX/cpufreq/ 目錄下各個(gè)文件的內容。
$ cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski
2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which need to switch frequency at the same time:
0 1
hardware limits: 1000 MHz - 1.67 GHz
available frequency steps: 1.67 GHz, 1.33 GHz, 1000
MHz
available cpufreq governors: userspace, conservative,
ondemand, powersave, performance
current policy: frequency should be within 1000 MHz
and 1.67 GHz.
The governor “ondemand” may decide which
speed to use
within this range.
current CPU frequency is 1000 MHz.
analyzing CPU 1:
driver: acpi-cpufreq
CPUs which need to switch frequency at the same time:
0 1
hardware limits: 1000 MHz - 1.67 GHz
available frequency steps: 1.67 GHz, 1.33 GHz, 1000
MHz
available cpufreq governors: userspace, conservative,
ondemand, powersave, performance
current policy: frequency should be within 1000 MHz
and 1.67 GHz.
The governor “ondemand” may decide which
speed to use
within this range.
current CPU frequency is 1000 MHz.
Ondemand governor 的由來(lái)及其實(shí)現剛剛我們在 cpufreq-info 的輸出中可以看到 cpufreq 子系統一共提供了五種 governors 供用戶(hù)選擇使用,它們分別是 userspace,conservative,ondemand,powersave 和performance。在最新的內核中如果用戶(hù)不進(jìn)行額外設置的話(huà),ondemand 會(huì )被作為默認的 governor 使用。為了理解是什么原因造成了這種現狀,我們在這里帶領(lǐng)讀者回顧一下 cpufreq 子系統中的governor在內核中的開(kāi)發(fā)歷史。
Cpufreq 作為一個(gè)子系統最早被加入到 Linux 內核中時(shí)只配備了三個(gè)governors ,分別是performance、powersave 和userspace。當用戶(hù)選擇使用 performance governor 時(shí),CPU會(huì )固定工作在其支持的最高運行頻率上;當用戶(hù)選擇使用powersave g
評論