新聞中心

EEPW首頁 > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > Linux2.6內(nèi)核中的最新電源管理技術(shù)綜述

Linux2.6內(nèi)核中的最新電源管理技術(shù)綜述

作者: 時(shí)間:2016-12-07 來源:網(wǎng)絡(luò) 收藏

  前言

本文引用地址:http://m.butianyuan.cn/article/201612/327535.htm

  本系列文章將結(jié)合近年來不斷在各種硬件(包括 CPU、芯片組、PCI Express 等各種最新總線標(biāo)準(zhǔn)以及外設(shè))上新增的節(jié)能技術(shù)。

  從 Linux? 2.6內(nèi)核及整個(gè) software stack (包括 kernel、middleware 以及各種用戶態(tài) utility)如何添加對(duì)這些創(chuàng)新的節(jié)能技術(shù)的支持這一角度,為讀者介紹 Linux 操作系統(tǒng)近幾年來在電源管理方面所取得的長足進(jìn)步以及未來的發(fā)展方向。

  作為本系列文章的開篇之作,首先要向大家介紹的是 cpufreq,它是 Linux 2.6內(nèi)核為了更好的支持近年來在各款主流CPU 處理器中出現(xiàn)的變頻技術(shù)而新增的一個(gè)內(nèi)核子系統(tǒng)。

  Cpufreq 的由來

  隨著 energy efficient computing 和 performance per watt 等概念的推廣以及高級(jí)配置與電源接口ACPI(Advanced Configuration and Power Interface)標(biāo)準(zhǔn)的發(fā)展,目前市場(chǎng)上的主流 CPU 都提供了對(duì)變頻(frequency scaling)技術(shù)的支持。例如Intel?處理器所支持的 Enhanced SpeedStep? 技術(shù)和 AMD? 處理器所支持的 PowerNow! ? 技術(shù),另外像最新的PowerPC?、ARM?、SPARC? 和 SuperH? 等處理器中也提供了類似的支持。參考資料中列出了當(dāng)前 Linux 2.6內(nèi)核所支持的具備變頻技術(shù)的處理器。需要注意的是,這里要討論的變頻技術(shù)與大家以前所熟知的超頻是兩個(gè)不同的概念。超頻是指通過提高核心電壓等手段讓處理器工作在非標(biāo)準(zhǔn)頻率下的行為,這往往會(huì)造成 CPU 使用壽命縮短以及系統(tǒng)穩(wěn)定性下降等嚴(yán)重后果。

  而變頻技術(shù)是指CPU硬件本身支持在不同的頻率下運(yùn)行,系統(tǒng)在運(yùn)行過程中可以根據(jù)隨時(shí)可能發(fā)生變化的系統(tǒng)負(fù)載情況動(dòng)態(tài)在這些不同的運(yùn)行頻率之間進(jìn)行切換,從而達(dá)到對(duì)性能和功耗做到二者兼顧的目的。

  雖然多個(gè)處理器生產(chǎn)廠家都提供了對(duì)變頻技術(shù)的支持,但是其硬件實(shí)現(xiàn)和使用方法必然存在著細(xì)微甚至巨大的差別。這就使得每個(gè)處理器生產(chǎn)廠家都需要按照其特殊的硬件實(shí)現(xiàn)和使用方法向內(nèi)核中添加代碼,從而讓自己產(chǎn)品中的變頻技術(shù)在 Linux 中得到支持和使用。然而,這種內(nèi)核開發(fā)模式所導(dǎo)致的后果是各個(gè)廠家的實(shí)現(xiàn)代碼散落在 Linux 內(nèi)核代碼樹的各個(gè)角落里,各種不同的實(shí)現(xiàn)之間沒有任何代碼是共享的,這給內(nèi)核的維護(hù)以及將來添加對(duì)新的產(chǎn)品的支持都帶來了巨大的開銷,并直接導(dǎo)致了 cpufreq 內(nèi)核子系統(tǒng)的誕生。實(shí)際上,正如前文所說,發(fā)明變頻技術(shù)的目的是為了能夠讓系統(tǒng)在運(yùn)行過程中隨時(shí)根據(jù)系統(tǒng)負(fù)載的變化動(dòng)態(tài)調(diào)整 CPU 的運(yùn)行頻率。這件事情可以分為兩個(gè)部分,一部分是“做什么”的問題,另一部分是“怎么做”的問題?!白鍪裁础笔侵溉绾胃鶕?jù)系統(tǒng)負(fù)載的動(dòng)態(tài)變化挑選出 CPU 合適的運(yùn)行頻率,而“怎么做”就是要按照選定的運(yùn)行頻率在選定的時(shí)間對(duì) CPU 進(jìn)行設(shè)置,使之真正工作在這一頻率上。這也就是我們?cè)谲浖O(shè)計(jì)中經(jīng)常會(huì)遇到的機(jī)制 mechanism 與策略 policy 的問題,而設(shè)計(jì)良好的軟件會(huì)在架構(gòu)上保證二者是被清晰的隔離開的并通過規(guī)范定義的接口進(jìn)行通信。

  Cpufreq 的設(shè)計(jì)和使用

  為了解決前文所提到的問題,一個(gè)新的內(nèi)核子系統(tǒng)—— cpufreq 應(yīng)運(yùn)而生了。Cpufreq 為在Linux 內(nèi)核中更好的支持不同 CPU 的變頻技術(shù)提供了一個(gè)統(tǒng)一的設(shè)計(jì)框架,其軟件結(jié)構(gòu)如圖 1 所示。

   

   圖 1. Cpufreq 的軟件結(jié)構(gòu)

如圖 1 所示,cpufreq 在設(shè)計(jì)上主要分為以下三個(gè)模塊:

  Cpufreq 模塊(cpufreq module)對(duì)如何在底層控制各種不同CPU 所支持的變頻技術(shù)以及如何在上層根據(jù)系統(tǒng)負(fù)載動(dòng)態(tài)選擇合適的運(yùn)行頻率進(jìn)行了封裝和抽象,并在二者之間定義了清晰的接口,從而在設(shè)計(jì)上完成了前文所提到的對(duì) mechanism 與policy 的分離。

  在 cpufreq 模塊的底層,各個(gè)CPU 生產(chǎn)廠商只需根據(jù)其變頻技術(shù)的硬件實(shí)現(xiàn)和使用方法提供與其 CPU 相關(guān)的變頻驅(qū)動(dòng)程序(CPU-specific drivers),例如 Intel 需要提供支持Enhanced SpeedStep 技術(shù)的 CPU 驅(qū)動(dòng)程序,而 AMD 則需要提供支持 PowerNow! 技術(shù)的 CPU 驅(qū)動(dòng)程序。

  在 cpufreq 模塊的上層,governor 作為選擇合適的目標(biāo)運(yùn)行頻率的決策者,根據(jù)一定的標(biāo)準(zhǔn)在適當(dāng)?shù)臅r(shí)刻選擇出 CPU 適合的運(yùn)行頻率,并通過 cpufreq 模塊定義的接口操作底層與 CPU 相關(guān)的變頻驅(qū)動(dòng)程序,將 CPU 設(shè)置運(yùn)行在選定的運(yùn)行頻率上。

  目前最新的 Linux 內(nèi)核中提供了 performance 、powersave 、userspace、conservative 和 ondemand 五種 governors 供用戶選擇使用,它們?cè)谶x擇 CPU 合適的運(yùn)行頻率時(shí)使用的是各自不同的標(biāo)準(zhǔn)并分別適用于不同的應(yīng)用場(chǎng)景。用戶在同一時(shí)間只能選擇其中一個(gè) governor 使用,但是可以在系統(tǒng)運(yùn)行過程中根據(jù)應(yīng)用需求的變化而切換使用另一個(gè) governor 。

  這種設(shè)計(jì)帶來的好處是使得 governor 和 CPU 相關(guān)的變頻驅(qū)動(dòng)程序的開發(fā)可以相互獨(dú)立進(jìn)行,并在最大限度上實(shí)現(xiàn)代碼重用,內(nèi)核開發(fā)人員在編寫和試驗(yàn)新的 governor 時(shí)不會(huì)再陷入到某款特定 CPU 的變頻技術(shù)的硬件實(shí)現(xiàn)細(xì)節(jié)中去,而 CPU 生產(chǎn)廠商在向 Linux 內(nèi)核中添加支持其特定的 CPU 變頻技術(shù)的代碼時(shí)只需提供一個(gè)相對(duì)來說簡單了很多的驅(qū)動(dòng)程序,而不必考慮在各種不同的應(yīng)用場(chǎng)景中如何選擇合適的運(yùn)行頻率這些復(fù)雜的問題。

  內(nèi)核中的 cpufreq 子系統(tǒng)通過 sysfs 文件系統(tǒng)向上層應(yīng)用提供了用戶接口,對(duì)于系統(tǒng)中的每一個(gè) CPU 而言,其 cpufreq 的 sysfs 用戶接口位于 /sys/devices/system/cpu/cpuX/cpufreq/ 目錄下,其中 X 代表 processor id ,與 /proc/cpuinfo 中的信息相對(duì)應(yīng)。以cpu0 為例,用戶一般會(huì)在該目錄下觀察到以下文件:

  $ 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)行讀操作,另外所有可寫文件都可以使用 echo 命令進(jìn)行寫操作。其中cpuinfo_max_freq 和 cpuinfo_min_freq 分別給出了CPU 硬件所支持的最高運(yùn)行頻率及最低運(yùn)行頻率, cpuinfo_cur_freq 則會(huì)從 CPU 硬件寄存器中讀取 CPU 當(dāng)前所處的運(yùn)行頻率。雖然 CPU 硬件支持多種不同的運(yùn)行頻率,但是在有些場(chǎng)合下用戶可以只選擇使用其中的一個(gè)子集,這種控制是通過scaling_max_freq 和 scaling_min_freq 進(jìn)行的。Governor在選擇合適的運(yùn)行頻率時(shí)只會(huì)在 scaling_max_freq 和scaling_min_freq 所確定的頻率范圍內(nèi)進(jìn)行選擇,這也就是scaling_available_frequencies 所顯示的內(nèi)容。與cpuinfo_cur_freq 不同, scaling_cur_freq 返回的是cpufreq 模塊緩存的 CPU 當(dāng)前運(yùn)行頻率,而不會(huì)對(duì) CPU 硬件寄存器進(jìn)行檢查。 scaling_available_governors 會(huì)告訴用戶當(dāng)前有哪些 governors 可供用戶使用,而 scaling_driver 則會(huì)顯示該 CPU 所使用的變頻驅(qū)動(dòng)程序。 Stats 目錄下給出了對(duì) CPU 各種運(yùn)行頻率的使用統(tǒng)計(jì)情況,例如 CPU 在各種頻率下的運(yùn)行時(shí)間以及在各種頻率之間的變頻次數(shù)。 Ondemand 目錄則與 ondemand governor 相關(guān),在后文會(huì)進(jìn)行相應(yīng)的介紹。

  通過以上的介紹,大家對(duì)如何使用 cpufreq 通過 sysfs 提供的用戶接口已經(jīng)有了大致的了解,但是對(duì)于絕大部分用戶而言,逐一操作這些文件既費(fèi)力又耗時(shí)。因此 Dominik 等人開發(fā)了cpufrequtils 工具包[2],為用戶提供了更加簡便的對(duì)內(nèi)核cpufreq 子系統(tǒng)的操作接口。通過 cpufreq-info 的輸出,讀者可以很清楚的看到剛剛在上面介紹過的/sys/devices/system/cpu/cpuX/cpufreq/ 目錄下各個(gè)文件的內(nèi)容。

  $ 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 的由來及其實(shí)現(xiàn)剛剛我們?cè)?cpufreq-info 的輸出中可以看到 cpufreq 子系統(tǒng)一共提供了五種 governors 供用戶選擇使用,它們分別是 userspace,conservative,ondemand,powersave 和performance。在最新的內(nèi)核中如果用戶不進(jìn)行額外設(shè)置的話,ondemand 會(huì)被作為默認(rèn)的 governor 使用。為了理解是什么原因造成了這種現(xiàn)狀,我們?cè)谶@里帶領(lǐng)讀者回顧一下 cpufreq 子系統(tǒng)中的governor在內(nèi)核中的開發(fā)歷史。

Cpufreq 作為一個(gè)子系統(tǒng)最早被加入到 Linux 內(nèi)核中時(shí)只配備了三個(gè)governors ,分別是performance、powersave 和userspace。當(dāng)用戶選擇使用 performance governor 時(shí),CPU會(huì)固定工作在其支持的最高運(yùn)行頻率上;當(dāng)用戶選擇使用powersave g


上一頁 1 2 3 下一頁

關(guān)鍵詞: Linux2.6內(nèi)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉