楊良懷,戚加欣,徐 衛(wèi),范玉雷
(浙江工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,杭州 310023)
能效是現(xiàn)代數(shù)據(jù)中心的重要議題[2],而峰值功率是數(shù)據(jù)中心的一個(gè)重要因素,對(duì)峰值功率的封頂控制是相關(guān)研究的熱點(diǎn)問(wèn)題之一[3-6].本文針對(duì)其中的整機(jī)功率感知問(wèn)題開(kāi)展研究.
通常有兩種獲取實(shí)時(shí)功率的方法:物理測(cè)量和軟件評(píng)估.使用儀器來(lái)測(cè)得功率較為精確,但其成本高;軟件評(píng)估靈活、成本低,且功率與系統(tǒng)狀態(tài)關(guān)聯(lián)的特性可以用于優(yōu)化功耗敏感的系統(tǒng)或程序.但后者需要解決測(cè)得功率的準(zhǔn)確度,以及額外資源、功耗開(kāi)銷(xiāo)的問(wèn)題.
在計(jì)算機(jī)系統(tǒng)中,處理器、內(nèi)存與磁盤(pán)是最主要的耗能部件,且隨著部件負(fù)載量的增加,其功率占比也隨著提高.本文基于這三個(gè)部件來(lái)構(gòu)建整機(jī)實(shí)時(shí)功率模型.本文的貢獻(xiàn)在于不僅利用硬件性能事件和部件利用率,同時(shí)利用處理器C-States來(lái)構(gòu)建通用型的整機(jī)系統(tǒng)實(shí)時(shí)功率模型.其主要思想是利用CPU性能事件與功耗之間存在的內(nèi)在聯(lián)系構(gòu)建功率模型,通過(guò)特征選擇算法選取模型的性能事件子集,依據(jù)不同C-States狀態(tài)把處理器和內(nèi)存部分的實(shí)時(shí)功率分為兩個(gè)階段:高功耗狀態(tài)與低功耗狀態(tài),分別建立功耗模型;基于利用率構(gòu)建磁盤(pán)的功率模型;結(jié)合兩者構(gòu)建整機(jī)功率模型.實(shí)驗(yàn)結(jié)果表明所提方法明顯提高了功耗計(jì)算準(zhǔn)確性.
從帶有一組性能計(jì)數(shù)器的奔騰系列起,英特爾引入了性能監(jiān)控機(jī)制,并在之后不斷完善該機(jī)制,同時(shí)增加新的性能監(jiān)控事件,研究人員可通過(guò)這些計(jì)數(shù)器獲得更為全面且詳細(xì)的架構(gòu)信息和性能事件,從而構(gòu)建功率模型.
Bellosa[7]最先利用整數(shù)操作、浮點(diǎn)數(shù)操作、二級(jí)尋址和內(nèi)存訪問(wèn)性能事件計(jì)數(shù)與功率近似線性相關(guān)進(jìn)行建模;但其性能事件的選擇方法、模型的準(zhǔn)確性都有待提升.
Isci等[8]為奔騰4處理器分成22個(gè)子單元,分別為每個(gè)子單元選擇合適的事件構(gòu)建功率模型.Bertran[9]定義了超過(guò)25個(gè)處理器微架構(gòu)組件,最終選擇了處理器前端(FE)、整數(shù)單元、浮點(diǎn)數(shù)單元、SIMD算術(shù)單元、分支預(yù)測(cè)和執(zhí)行單元、一級(jí)緩存、二級(jí)緩存、前端總線(FSB)這八個(gè)處理器微架構(gòu)組件,共使用20個(gè)性能事件,基于處理器組件的活躍比例,針對(duì)不同DVFS配置分別構(gòu)建了單核和多核的處理器功率模型.不同處理器架構(gòu)中,性能計(jì)數(shù)器的可訪問(wèn)性和可用程度均有差異;為此,Rance等[10]尋找出可被任意處理器架構(gòu)使用的性能事件子集,且使用該子集所構(gòu)建的功率模型具有良好的準(zhǔn)確性.所建模型中,最多的使用了6個(gè)性能事件,最少使用了1個(gè)性能事件,相對(duì)誤差在4%~13%之間.劉辛等[11]通過(guò)篩選處理器的硬件事件對(duì)多核處理器進(jìn)行功耗建模,使用逐步多元線性回歸分析建立實(shí)時(shí)功耗模型.利用PARSEC和SPLASH2基準(zhǔn)測(cè)試程序集對(duì)模型進(jìn)行了驗(yàn)證,估算誤差分別為3.01%和1.99%.不同于本文整機(jī)功率建模,以上模型均是處理器功耗模型,整機(jī)系統(tǒng)中則涉及CPU外圍電路、磁盤(pán)、主板其他部件等功率;由于其他部件不像CPU有許多可用性能事件來(lái)表征功耗,整機(jī)功耗模型的構(gòu)建有一定挑戰(zhàn)性.
Bertran[12]等人將基于計(jì)數(shù)器的建模方法分為兩種類(lèi)型:自頂向下和自底向上.這兩種方法的主要區(qū)別在于對(duì)計(jì)數(shù)器的選擇.自頂向下構(gòu)建的模型平臺(tái)移植性較強(qiáng),模型也相對(duì)簡(jiǎn)單;而自底向上功率模型對(duì)平臺(tái)的依賴性較強(qiáng),移植性較差,復(fù)雜度相對(duì)高,但模型更為準(zhǔn)確.本文提出的模型綜合兩種方法的優(yōu)點(diǎn),通過(guò)特征選取,選擇最合適的硬件性能事件,簡(jiǎn)化了模型,縮短了訓(xùn)練時(shí)間,便于模型被理解,也改善了通用性、降低過(guò)擬合的可能.
Zhu[13]等討論了非線性回歸方法模型在功耗模型上的應(yīng)用,與多變量線性方法相比,非線性回歸方法僅具有輕微的準(zhǔn)確性優(yōu)勢(shì),但其需要更長(zhǎng)的訓(xùn)練時(shí)間以及具有較差的可移植性.Powell等[14]利用運(yùn)行時(shí)微處理器在內(nèi)核以及微架構(gòu)中的獨(dú)立結(jié)構(gòu)的功率消耗以及各個(gè)部件活躍度進(jìn)行功率建模.但在實(shí)際應(yīng)用中,由于商用處理器和模擬器之間的細(xì)微差別,以及不同處理器之間的微小差異,難以用模擬器精確地描述實(shí)際系統(tǒng).
本文結(jié)合性能事件與部件利用率,同時(shí)利用CPU的功耗狀態(tài)來(lái)構(gòu)建整機(jī)功率模型,并與傳統(tǒng)模型進(jìn)行比較.
處理器的功耗與負(fù)載相關(guān),處理器的負(fù)載狀態(tài)可以通過(guò)計(jì)算處理器的利用率近似獲得,也可以使用處理器的性能計(jì)數(shù)器監(jiān)測(cè)處理器內(nèi)部的性能事件更為精確地獲得.現(xiàn)代的處理器芯片都提供性能計(jì)數(shù)器,CPU性能計(jì)數(shù)器或性能監(jiān)控單元(PMU)是可以計(jì)數(shù)低級(jí)CPU活動(dòng)的特定模塊寄存器(MSR).通常包括下列計(jì)數(shù)器:CPU周期,CPU指令,L1、L2、L3緩存訪問(wèn),浮點(diǎn)單元,內(nèi)存I/O,資源I/O.與功率相關(guān)的事件包括:執(zhí)行指令數(shù)、分支預(yù)測(cè)單元、指令周期(cycle)、高速緩存缺失、處理器暫停、頁(yè)表緩存缺失、每周期指令數(shù)(IPC).可以通過(guò)獲取UNHALTED-CORE-CYCLES和INSTRUCTIONS-RETIRED來(lái)計(jì)算得到每周期指令數(shù)IPC,公式如下:
(1)
內(nèi)存功耗包括背景功耗、操作功耗、讀寫(xiě)功耗和I/O功耗.背景功耗描述了沒(méi)有存儲(chǔ)器訪問(wèn)時(shí)DRAM芯片的功率.操作功耗指DRAM芯片上電時(shí)執(zhí)行預(yù)充電操作的功耗.當(dāng)數(shù)據(jù)被讀出或?qū)懭胄酒瑫r(shí),讀寫(xiě)功耗被消耗.最后,I/O功耗是用于驅(qū)動(dòng)數(shù)據(jù)總線的功耗,現(xiàn)有的內(nèi)存功率模型研究發(fā)現(xiàn)影響內(nèi)存消耗的主要因素是內(nèi)存讀寫(xiě)吞吐量[16].因此,想要知道內(nèi)存消耗的功率,除了直接通過(guò)儀器測(cè)量,也可以通過(guò)內(nèi)存的讀寫(xiě)吞吐量建模獲取內(nèi)存實(shí)時(shí)功率.內(nèi)存本身并不是一個(gè)高能耗的組件,單獨(dú)的SDRAM芯片的功耗取決于很多因素,包括速度、使用類(lèi)型、電壓等.4G大小的DDR3/1600 DIMM的內(nèi)存功率一般為2W~3W,此外還有功耗更低的DDR3L、DDR4內(nèi)存.但是在服務(wù)器上,由于使用的內(nèi)存條數(shù)較多,內(nèi)存功耗也比較可觀.
磁盤(pán)功率也是整機(jī)功耗的重要部分,特別是一些服務(wù)器擁有數(shù)目眾多的磁盤(pán).磁盤(pán)功率主要由驅(qū)動(dòng)盤(pán)片旋轉(zhuǎn)的電機(jī)功率、磁頭驅(qū)動(dòng)電路和邏輯電路部分功率組成.當(dāng)磁盤(pán)沒(méi)有讀寫(xiě)時(shí),電機(jī)和邏輯電路仍然需要消耗電力來(lái)維持磁盤(pán)的運(yùn)行,這部分功率被認(rèn)為是恒定的.當(dāng)磁盤(pán)空閑時(shí),磁頭不尋找,一旦有讀寫(xiě)操作,磁頭開(kāi)始尋道并開(kāi)始讀寫(xiě)盤(pán)片,邏輯電路同時(shí)開(kāi)始處理并傳輸數(shù)據(jù),這部分功率隨著不同的I/O操作而變化.一般來(lái)說(shuō),磁盤(pán)的利用率越高,功率就越高.
整機(jī)系統(tǒng)功率(P)由兩部分組成:靜態(tài)功率(Pstatic)和動(dòng)態(tài)功率(Pdyn).因此有:
P=Pstatic+Pdyn
(2)
本文主要考慮CPU、磁盤(pán)和內(nèi)存這三個(gè)部件,動(dòng)態(tài)功率由這三部件在系統(tǒng)有負(fù)載運(yùn)行時(shí)額外產(chǎn)生的功率:
Pdyn=Pcpu+Pdisk+Pmem
(3)
注意,Pcpu、Pdisk、Pmem是指相應(yīng)部件的動(dòng)態(tài)功率部分,靜態(tài)功率全部記入Pstatic中.
能耗是功率與時(shí)間片乘積的積分,如果時(shí)間Δt時(shí)間片足夠小,可以看作功率與時(shí)間的乘積.在時(shí)間Δt內(nèi),CPU、磁盤(pán)和內(nèi)存分別運(yùn)行了Δt1、Δt2和Δt3秒,則在這段時(shí)間Δt內(nèi),系統(tǒng)消耗能量P×Δt,這些部件消耗的動(dòng)態(tài)能量分別為:Pcpu×Δt1、Pdisk×Δt2和Pmem×Δt3.故有:
P×Δt=Pstatic×Δt+Pcpu×Δt1+Pdisk×Δt2+Pmem×Δt3
(4)
等式兩邊同除時(shí)間Δt,得到式(5):
(5)
根據(jù)組件的利用率定義,Ucpu=Δt1/Δt表示CPU在時(shí)間Δt內(nèi)的使用率,Udisk=Δt2/Δt表示磁盤(pán)的利用率,Umem=Δt3/Δt表示內(nèi)存的利用率.代入式(5)得到:
P=Pstatic+Pcpu×Ucpu+Pdisk×Udisk+Pmem×Umem
(6)
將式(6)中Pcpu用α代替,Pdisk替換為β,Pmem替換為γ,并用S替換靜態(tài)功率Pstatic,得到功率模型(7)式.
P=S+α×Ucpu+β×Udisk+γ×Umem
(7)
對(duì)于CMP單芯片多處理器,假設(shè)有n個(gè)內(nèi)核,每個(gè)內(nèi)核記為ci,i∈[1,n];最后得到如下的模型原型:
(8)
其中S為待測(cè)機(jī)的靜態(tài)功率,Uci表示第i個(gè)執(zhí)行核的利用率.假設(shè)各個(gè)核的執(zhí)行能力等價(jià),則可以認(rèn)為每個(gè)核所對(duì)應(yīng)的系數(shù)αi相等,記為α.公式(8)即變?yōu)?/p>
(9)
稱(chēng)為模型PM1,其中系數(shù)S、α、β和γ由多元線性回歸模型訓(xùn)練得到.
4.2.1 性能事件選擇
由于系統(tǒng)中的所有活動(dòng)都會(huì)產(chǎn)生一定的能量消耗,因此任何與之相關(guān)的性能事件都可以作為功率模型的輸入?yún)?shù).一般情況下,處理器都會(huì)提供至少幾十個(gè)性能事件,選取合適的性能事件是構(gòu)建功率模型面臨的首要問(wèn)題.如果選擇的性能事件過(guò)多,會(huì)導(dǎo)致模型過(guò)分復(fù)雜,開(kāi)銷(xiāo)大,并且不利于模型移植到其他平臺(tái),因?yàn)檫x擇的性能事件多了,涉及到的非架構(gòu)兼容性的事件可能性也大了.反之,性能事件過(guò)少,信息不夠完全,可能不足以用來(lái)反映功率.同時(shí)也需要考慮性能事件之間的關(guān)聯(lián)性和性能事件存在冗余的情況.
同時(shí),當(dāng)監(jiān)測(cè)的性能事件個(gè)數(shù)超過(guò)性能計(jì)數(shù)器個(gè)數(shù)時(shí),通過(guò)使用時(shí)分復(fù)用,以便每個(gè)事件都有機(jī)會(huì)訪問(wèn)監(jiān)視硬件.在運(yùn)行結(jié)束時(shí),根據(jù)總的計(jì)數(shù)啟動(dòng)時(shí)間與運(yùn)行時(shí)間來(lái)縮放計(jì)數(shù)值.最終輸出的計(jì)數(shù)值為:
Cfinal=Craw*Tenabled/Trunning
(10)
其中Cfinal為最終輸出的計(jì)數(shù)值,Craw為實(shí)際性能計(jì)數(shù)器獲取的計(jì)數(shù)值,Tenabled為性能計(jì)數(shù)器總的計(jì)數(shù)啟動(dòng)時(shí)間,Trunning為性能計(jì)數(shù)器的運(yùn)行時(shí)間.可見(jiàn),監(jiān)測(cè)的性能事件越多,則每一個(gè)事件進(jìn)入性能計(jì)數(shù)器的時(shí)間越短,而最終縮放得到的計(jì)數(shù)值越不準(zhǔn)確,而數(shù)據(jù)的準(zhǔn)確性直接影響模型的準(zhǔn)確性.因此不能將所有的預(yù)定義事件進(jìn)行監(jiān)測(cè),而應(yīng)當(dāng)選擇適當(dāng)?shù)男阅苁录?
如何選擇用于建模的性能事件.首先本文通過(guò)公式(11)計(jì)算每個(gè)性能事件與功率之間的相關(guān)系數(shù),即皮爾遜相關(guān)系數(shù),計(jì)算所得的相關(guān)系數(shù)越接近0,表示兩者的相關(guān)性越差;越接近1,表示兩者的正相關(guān)性越好;越接近-1表示兩者的負(fù)相關(guān)性越好.約定皮爾遜相關(guān)系數(shù)絕對(duì)值小于0.3時(shí)相關(guān)性低,排除與功率相關(guān)性低的事件.
(11)
從剩余的性能事件中選取與功率密切相關(guān)的性能事件,得到用于建模的性能事件的初步選擇范圍.利用數(shù)據(jù)挖掘工具Weka進(jìn)行屬性選擇,使用子集評(píng)估器CfsSubsetEval和搜索算法BestFirst選擇性能事件集.在皮爾遜相關(guān)系數(shù)的基礎(chǔ)上進(jìn)一步使用子集特征選擇,是因?yàn)槠栠d相關(guān)系數(shù)在特征選擇中屬于過(guò)濾(filter)方法,它關(guān)注單個(gè)特征屬性與目標(biāo)屬性的相關(guān)性,沒(méi)有考慮特征之間的相關(guān)性,可能存在冗余的特征;另外,某些屬性的組合可能達(dá)到最佳的回歸效果.目標(biāo)是使選擇的性能事件數(shù)與CPU提供的性能計(jì)數(shù)器數(shù)目大體一致,當(dāng)搜索算法BestFirst的搜索方向選擇為向后,指定在終止搜索之前允許的連續(xù)非改進(jìn)節(jié)點(diǎn)的數(shù)量為8時(shí)滿足目標(biāo),得到建模所用到的預(yù)定義性能事件如表 1所示,表左側(cè)為perf提供的預(yù)定義事件,表右側(cè)為預(yù)定義事件在Haswell架構(gòu)處理器中對(duì)應(yīng)的原生事件.英特爾在性能計(jì)數(shù)器中沒(méi)有包含明確的事件來(lái)區(qū)分對(duì)LLC的訪問(wèn),對(duì)于表格中的OFFCORE-RESPONSE原生事件,使用DMND-DATA-RD請(qǐng)求類(lèi)型計(jì)算加載未命中數(shù),通過(guò)設(shè)置MSR寄存器的Response Supplier和Snoop Info字段,可以區(qū)分緩存命中和失敗[注]64-ia-32-architectures-optimization-manual[EB/OL]. http://www.intel.com /content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html. 2017 Nov..
表1 建模所用到的性能事件
Table 1 Performance events used in modeling
事件原生事件cpu-cyclesCPU-CLK-UNHALTED.COREinstructionsINST-RETIRED.ANYbranch-instructionsBR-INST-RETIRED.ALL-BRANCHESbus-cyclesCPU-CLK-THREAD-UNHALTED.REF-XCLKL1-dcache-load-missesL1D.REPLACEMENTLLC-loadsOFFCORE-RESPONSELLC-load-missesOFFCORE-RESPONSE
4.2.2 處理器與內(nèi)存功率模型
由于內(nèi)存相關(guān)性能事件功率在整機(jī)功率中所占不大且變化不明顯(在下文所進(jìn)行的實(shí)驗(yàn)中,內(nèi)存所占功率為整機(jī)功率的2%以下,內(nèi)存功率標(biāo)準(zhǔn)差為0.38W),因此,本文把處理器和內(nèi)存作為一個(gè)整體考慮,即
(12)
其中n為處理器核數(shù),向量ωi為每個(gè)處理器核每個(gè)性能事件對(duì)應(yīng)的待估參數(shù)向量,X為所選擇的性能事件計(jì)數(shù)向量,S為常量.假設(shè)各個(gè)核的執(zhí)行能力等價(jià),那么可以認(rèn)為每個(gè)核所對(duì)應(yīng)的系數(shù)ωi相等,記為ω,令向量α表示nω.公式(12)可進(jìn)一步簡(jiǎn)化為:
Pcpu+Pmem=S+αTX
(13)
目前的處理器利用CPU功耗狀態(tài)C-States描述處理器當(dāng)前的功耗和熱管理狀態(tài),具體可分為C0到C*(*為整數(shù),取決于CPU類(lèi)型),代表當(dāng)核心空閑時(shí)可以進(jìn)入的睡眠級(jí)別.C0狀態(tài)下CPU正常運(yùn)行;CPU運(yùn)行于更高的C狀態(tài)意味著消耗更低的功率,但從此狀態(tài)返回到C0需要更長(zhǎng)延遲.處理器只有在空閑狀態(tài)下,才有可能進(jìn)入非C0的C-States.ACPI規(guī)范描述了C0-C3,但最近的CPU支持更多的C狀態(tài).以Haswell架構(gòu)的桌面Intel處理器為例,其擁有的各個(gè)C-States如表 2所示.
當(dāng)處理器處于空閑狀態(tài)時(shí),大部分時(shí)間都處于最深的C-States.Linux的內(nèi)核啟動(dòng)參數(shù)intel-idle.max-cstate可以控制處理器可進(jìn)入的最深C-States,通過(guò)設(shè)置不同的intel-idle.max-cstate參數(shù),可得如圖 1所示的C-States與CPU功率的關(guān)系.可見(jiàn),同樣在空閑狀態(tài)下,當(dāng)處理器處于不同的C-States時(shí),其所消耗的功率不同,在實(shí)時(shí)功率建模過(guò)程中引入C-States十分有必要.需要注意的是,由于Linux內(nèi)核的限制,當(dāng)允許進(jìn)入最深的C-States為C6時(shí),實(shí)際已經(jīng)啟用C7,此時(shí)CPU大部分時(shí)間實(shí)際處于C7狀態(tài).
在采樣間隔內(nèi),進(jìn)入深層C-States的次數(shù)越多,處理器在該時(shí)間段的功率就越低.可以把處理器與內(nèi)存功率分為兩段,第一個(gè)階段為高功耗狀態(tài),此階段中在每個(gè)采樣間隔內(nèi)處理器基本都處于C0狀態(tài),處理器與內(nèi)存的功率模型只需要使用各個(gè)性能事件計(jì)數(shù)作為參數(shù);第二個(gè)階段為低功耗狀態(tài),此階段中在每個(gè)采樣間隔內(nèi)處理器有一定幾率進(jìn)入深層C-States,所以處理器與內(nèi)存的功率模型除了使用性能事件作為參數(shù),還需要使用各個(gè)C-States的計(jì)數(shù)作為額外的模型參數(shù).在實(shí)驗(yàn)中,本文進(jìn)行計(jì)數(shù)的C-States為C3、C6、C7.根據(jù)以上分析,可以進(jìn)一步細(xì)化公式:
(14)
其中,C3,C6,C7=0表示處理器處于C0狀態(tài),這時(shí)處理器處于高功耗狀態(tài),而“其他”表示處理器有一定幾率進(jìn)入深層C-States,處理器有幾率進(jìn)入低功耗狀態(tài);S1、S2是模型在不同階段相應(yīng)的待估常量,用于反映靜態(tài)功率;向量α1、α2為模型不同階段對(duì)應(yīng)的待估參數(shù)向量;參數(shù)向量X1、X2為模型不同階段所選取的性能事件的計(jì)數(shù),兩者有所不同,如下所示:
待估系數(shù)通過(guò)多元線性回歸方法獲得,由此構(gòu)建了基于性能事件與C-States的處理器和內(nèi)存實(shí)時(shí)功率模型.
4.2.3 整機(jī)功率模型
據(jù)前述,整機(jī)功率由靜態(tài)功率和動(dòng)態(tài)功率組成,靜態(tài)功率由功耗儀測(cè)量所得,動(dòng)態(tài)功率主要考慮處理器、磁盤(pán)和內(nèi)存執(zhí)行任務(wù)時(shí)額外產(chǎn)生的功率.由公式(9),磁盤(pán)功率為待估系數(shù)乘以磁盤(pán)的利用率βUdisk.因此,結(jié)合公式(14),最終整機(jī)功率可以表示為:
(15)
待估系數(shù)也是由多元線性回歸方法獲得.基于性能事件、C-States和部件利用率所構(gòu)建的整機(jī)實(shí)時(shí)功率模型稱(chēng)為PM2.
表2 C-States各個(gè)狀態(tài)
Table 2 C-States states
C-State名稱(chēng)描述C0正常運(yùn)行CPU完全打開(kāi)并執(zhí)行指令,處于某個(gè)P-states狀態(tài)C1掛起CPU主內(nèi)部時(shí)鐘停止.總線接口單元和APIC全速運(yùn)行.C3深度睡眠CPU內(nèi)部和外部時(shí)鐘停止,清空L1/L2緩存.C6深度節(jié)能核心狀態(tài)保存到內(nèi)存中.可以將CPU內(nèi)部電壓降低到任何值,包括0VC7更深度節(jié)能在C6基礎(chǔ)上同時(shí)清空L3緩存
圖1 空閑狀態(tài)下C-States與CPU功率的關(guān)系Fig.1 Relations between C-States and CPU power in idle state
實(shí)驗(yàn)中主機(jī)采用Intel Core i5-4590處理器、兩條DDR3 1600MHz 4GB 1600MHz內(nèi)存、西數(shù)5400轉(zhuǎn)1TB機(jī)械硬盤(pán),Ubuntu 16.04系統(tǒng)作為實(shí)驗(yàn)環(huán)境,并使用C語(yǔ)言實(shí)現(xiàn)模型架構(gòu).系統(tǒng)使用杭州遠(yuǎn)方光電信息股份有限公司的PF9808B數(shù)字功耗儀,搭建了實(shí)驗(yàn)環(huán)境.為了避免功耗儀采樣程序?qū)?shí)驗(yàn)的影響,功耗儀采樣程序在另一臺(tái)主機(jī)上運(yùn)行,兩臺(tái)主機(jī)之間通過(guò)交換機(jī)相連,被測(cè)系統(tǒng)正常運(yùn)行,監(jiān)控測(cè)量系統(tǒng)記錄采樣功率.其中,數(shù)字功耗儀以一秒為周期進(jìn)行采樣,監(jiān)控測(cè)量系統(tǒng)通過(guò)串口得到相應(yīng)數(shù)據(jù).此外在實(shí)驗(yàn)中盡量保證在相同溫度時(shí)段開(kāi)展實(shí)驗(yàn),減少其他因素對(duì)功耗模型的干擾.
5.2.1 數(shù)據(jù)采集
Linux中存在/proc與/sys目錄,他們是提供內(nèi)核統(tǒng)計(jì)信息的文件系統(tǒng)接口,包含許多目錄與文件./proc與/sys目錄由內(nèi)核動(dòng)態(tài)創(chuàng)建,通過(guò)proc與sysfs文件系統(tǒng)直接在內(nèi)存中存儲(chǔ),多數(shù)文件是只讀的,使用標(biāo)準(zhǔn)的POSIX文件系統(tǒng)調(diào)用即可訪問(wèn)數(shù)據(jù).由于數(shù)據(jù)已經(jīng)由內(nèi)核計(jì)算出并在內(nèi)存中存儲(chǔ)著,因此讀取這些數(shù)據(jù)產(chǎn)生的開(kāi)銷(xiāo)非常小.CPU利用率通過(guò)測(cè)量一段時(shí)間內(nèi)CPU忙于執(zhí)行負(fù)載的時(shí)間比例獲得,磁盤(pán)使用率可以通過(guò)某段時(shí)間內(nèi)磁盤(pán)運(yùn)行工作的忙時(shí)間的比例計(jì)算得出,這些信息可以從proc與sysfs文件系統(tǒng)中獲取.
5.2.2 訓(xùn)練集合與過(guò)程
本文基于利用率構(gòu)建的整機(jī)功率模型主要針對(duì)數(shù)據(jù)庫(kù)系統(tǒng).針對(duì)數(shù)據(jù)庫(kù)常用四種連接算法,編寫(xiě)人工負(fù)載用于產(chǎn)生模型的訓(xùn)練集.同時(shí),為使模型具有普適性,考慮處理器同時(shí)執(zhí)行的內(nèi)核數(shù)對(duì)模型的影響,分別按照單核、雙核、三核以及四核運(yùn)行模式構(gòu)建人工負(fù)載,且人工負(fù)載產(chǎn)生的CPU利用率在0-100%內(nèi)呈階梯分布.實(shí)驗(yàn)中CPU頻率由intel-pstate驅(qū)動(dòng)根據(jù)負(fù)載控制.鑒于數(shù)據(jù)庫(kù)連接操作的磁盤(pán)利用率都很高,實(shí)驗(yàn)負(fù)載產(chǎn)生50%,75%與100%這幾種利用率.內(nèi)存負(fù)載不人為控制,僅由系統(tǒng)運(yùn)行時(shí)自然產(chǎn)生.
為了獲得足夠多、更穩(wěn)定的數(shù)據(jù),訓(xùn)練集合中的負(fù)載重復(fù)運(yùn)行了10次,最后獲得10次訓(xùn)練聚合后的數(shù)據(jù),通過(guò)CPU利用率、磁盤(pán)利用率和整機(jī)實(shí)時(shí)功率,使用多元線性回歸模型訓(xùn)練就得到了利用率構(gòu)建的整機(jī)功率模型PM1為
5.3.1 數(shù)據(jù)采集
在Linux下,有多種工具或庫(kù)可以用于性能計(jì)數(shù)器的采集,流行的有OProfile、PAPI、perf.本文采用perf[15]獲取性能事件.perf是Linux平臺(tái)下的性能分析工具,封裝了底層perf-events接口,向上層提供了豐富的功能:可以指定需要監(jiān)測(cè)的性能事件;提供線程級(jí)、core級(jí)、CPU級(jí)、系統(tǒng)級(jí)的事件計(jì)數(shù);可以指定監(jiān)測(cè)性能事件在用戶態(tài)、內(nèi)核態(tài)或兩者同時(shí)進(jìn)行監(jiān)控;當(dāng)監(jiān)測(cè)硬件性能事件多于性能計(jì)數(shù)器,自動(dòng)通過(guò)時(shí)分復(fù)用繼續(xù)提供監(jiān)測(cè),同時(shí)由于內(nèi)核開(kāi)發(fā)者的良好設(shè)計(jì)與開(kāi)發(fā),perf采樣時(shí)開(kāi)銷(xiāo)很低.本文基于perf的用戶層工具代碼,增加了一些實(shí)驗(yàn)需要的修改,以此作為數(shù)據(jù)采集程序.
對(duì)于建模需要的處理器和內(nèi)存的功率,可以使用RAPL(Running Average Power Limit)[16]獲得,Intel處理器使用RAPL接口提供了目前的能源消耗量的測(cè)量,分為PKG、PP0、PP1、DRAM四個(gè)值,其分別代表整個(gè)處理器的能源消耗、所有核的能源消耗、核芯顯卡的能源消耗、內(nèi)存的能源消耗.存放于四個(gè)特殊的性能計(jì)數(shù)器中,可以直接通過(guò)perf讀取.使用RAPL獲取的功率值具有較為良好的準(zhǔn)確性,但該方案目前還沒(méi)有完全普及,有些處理器不具有能量寄存器,不支持該功能.
Intel處理器提供兩類(lèi)MSR寄存器:MSR-CORE-C*-RESIDENCY用于計(jì)數(shù)每個(gè)物理內(nèi)核處于特定C-State的計(jì)數(shù);MSR-PKG-C*-RESIDENCY用于計(jì)數(shù)每個(gè)物理封裝處于特定C-State的計(jì)數(shù)1,其中C*為特定的C-States,可以使用perf直接讀取該MSR寄存器,由于實(shí)驗(yàn)機(jī)只有一個(gè)處理器,本文只關(guān)心前一個(gè)計(jì)數(shù).
本文使用功耗儀采集整機(jī)系統(tǒng)的功率值,使用RAPL采集處理器和內(nèi)存部分的實(shí)時(shí)功率,使用perf采集性能事件與C-States計(jì)數(shù),本文由于需要獲得整機(jī)的實(shí)時(shí)功率,因此同時(shí)監(jiān)測(cè)性能事件處于用戶態(tài)和內(nèi)核態(tài)的計(jì)數(shù).
5.3.2 訓(xùn)練集合與過(guò)程
本文所構(gòu)建的基于性能事件、C-States和利用率的功率模型獨(dú)立于具體負(fù)載,為此選用了SPEC CPU2006[17]作為處理器基準(zhǔn)測(cè)試.SPEC CPU2006基準(zhǔn)測(cè)試是一個(gè)標(biāo)準(zhǔn)的測(cè)試集合,包括SPECint整型數(shù)測(cè)試和SPECfp浮點(diǎn)數(shù)測(cè)試,共31項(xiàng)測(cè)試.各種測(cè)試可以模擬處理器遇到的各種情景.SPEC CPU2006是計(jì)算密集型負(fù)載,可以適應(yīng)處理器和內(nèi)存功率模型的訓(xùn)練,對(duì)于磁盤(pán)功率模型部分,需要增加I/O密集型的訓(xùn)練集合,同樣在模型PM2上,也使用了按照單核、雙核、三核以及四核運(yùn)行,CPU利用率在0-100%內(nèi)呈階梯分布,I/O利用率在 50%,75%與100%分布的人工負(fù)載.
同基于利用率的整機(jī)功率模型的訓(xùn)練過(guò)程一樣,為了獲得足夠多、更穩(wěn)定的數(shù)據(jù),訓(xùn)練集合中的I/O密集型的負(fù)載重復(fù)運(yùn)行了10次,而SPEC CPU2006在運(yùn)行過(guò)程中,每個(gè)測(cè)試項(xiàng)目運(yùn)行的次數(shù)被配置為3次,通過(guò)程序匯總性能事件的計(jì)數(shù)值、C-States計(jì)數(shù)與對(duì)應(yīng)的處理器與內(nèi)存功率值或整機(jī)功率值后,本文使用多元線性回歸計(jì)算出模型PM2公式(16)的待估參數(shù)、待估常量如下所示.
S1=11.6157854129S2=2.15105333269
β1=3.06718196e-03β1=6.45502333e-03.
為了驗(yàn)證兩種功率模型的準(zhǔn)確性,本文使用了與訓(xùn)練集合不相交的程序作為測(cè)試集合.基于利用率的整機(jī)系統(tǒng)實(shí)時(shí)功率模型是針對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的,而結(jié)合性能事件和利用率的整機(jī)系統(tǒng)實(shí)時(shí)功率模型是通用型的,本文將比較這兩類(lèi)模型對(duì)塊嵌套循環(huán)連接算法(BNL)、排序歸并連接算法(SMJ)、Grace哈希連接算法(GHJ)、混合哈希連接算法(HHJ)這四類(lèi)連接算法的估測(cè)情況,同時(shí)使用Eureqa與TPC-H負(fù)載對(duì)結(jié)合性能事件和利用率的模型進(jìn)行驗(yàn)證.Eureqa使用進(jìn)化搜索來(lái)確定以最簡(jiǎn)單的形式描述數(shù)據(jù)集的數(shù)學(xué)方程式,是計(jì)算密集型負(fù)載.TPC-H基準(zhǔn)測(cè)試旨在衡量數(shù)據(jù)倉(cāng)庫(kù)工作負(fù)載的性能,同時(shí)屬于計(jì)算密集型和I/O密集型負(fù)載.在實(shí)驗(yàn)中,TPC-H的查詢運(yùn)行在PostgreSQL數(shù)據(jù)庫(kù)上,比例因子設(shè)為100,即所有表的數(shù)據(jù)量為100GB,TPC-H基準(zhǔn)測(cè)試提供了22條查詢,實(shí)驗(yàn)選取了查詢時(shí)間較短的查詢Q14、Q19和查詢時(shí)間較長(zhǎng)的查詢Q1、Q2、Q5與Q21.
表3表示兩類(lèi)整機(jī)功率模型對(duì)各種負(fù)載功率估測(cè)的相對(duì)誤差.在所進(jìn)行的所有實(shí)驗(yàn)中,基于性能事件與C-States的處理器與內(nèi)存功率模型一致優(yōu)于基于性能事件的處理器與內(nèi)存功率模型,實(shí)驗(yàn)表明加入C-States狀態(tài)計(jì)數(shù)確實(shí)提高了功率模型的準(zhǔn)確性.對(duì)于整機(jī)功率模型,總體來(lái)說(shuō),模型PM2對(duì)數(shù)據(jù)庫(kù)系統(tǒng)構(gòu)建的模型和通用型的模型都有著良好的準(zhǔn)確性,絕大部分情況均優(yōu)于模型PM1.從表3看出,在處理器與內(nèi)存功率模型方面,對(duì)于四類(lèi)連接算法,其在加入C-States后,預(yù)測(cè)準(zhǔn)確性有提升,最高提升值1%,對(duì)Eureqa以及TPC-H查詢而言,加入C-States后,預(yù)測(cè)準(zhǔn)確性最高提升值為5%;而在整機(jī)模型方面,其準(zhǔn)確性除了SMJ算法中PM2略遜色之外,對(duì)于其余算法模型PM2均不同程度優(yōu)于PM1,最高提升超過(guò)7%.
表3 各模型對(duì)幾種測(cè)試負(fù)載的相對(duì)誤差表
Table 3 Relative error for models against several test loads
平均相對(duì)誤差(單位:%)處理器與內(nèi)存功率模型Pcpu+Pmem整機(jī)功率模型基于性能事件基于性能事件與C-StatesPM1PM2連接算法BNLHHJGHJSMJ1.62.72.22.81.12.51.71.99.95.110.36.98.94.89.67.0Eureqa1.91.56.04.9TPC-HQ12.82.67.65.9TPC-HQ27.42.912.67.8TPC-HQ57.32.113.78.2TPC-HQ144.02.710.69.0TPC-HQ193.32.68.66.6TPC-HQ216.52.514.37.5
圖2 功率模型估測(cè)圖Fig.2 Predicted vs measured power
圖2(a-d)描繪了四類(lèi)連接算法在運(yùn)行過(guò)程中的功率測(cè)量值和模型PM2估測(cè)值的關(guān)系.圖2(e-h)描繪了Eureqa和TPC-H基準(zhǔn)在運(yùn)行過(guò)程中的功率測(cè)量值和模型PM2估測(cè)值的關(guān)系.圖2(h)是Eureqa運(yùn)行時(shí)的功率估測(cè)圖,同時(shí)觀察表3可以發(fā)現(xiàn),對(duì)于Eureqa這種CPU密集型的計(jì)算,所選性能事件已經(jīng)可以非常準(zhǔn)確地對(duì)處理器與內(nèi)存功率建模,相對(duì)誤差不到2%;但在整機(jī)模型中,模型PM2估測(cè)準(zhǔn)確性優(yōu)于PM1,仍有約5%的相對(duì)誤差.圖2(e-g)呈現(xiàn)的是三個(gè)TPC-H基準(zhǔn)查詢?cè)赑ostgreSQL數(shù)據(jù)庫(kù)系統(tǒng)中運(yùn)行時(shí)的模型PM2功率估測(cè)圖.其中圖2(f)為查詢時(shí)間較短的查詢Q14,圖2(e)和圖2(g)為兩個(gè)查詢時(shí)間較長(zhǎng)的查詢Q5和Q21.觀察表3可以發(fā)現(xiàn),對(duì)于TPC-H負(fù)載,加入C-States后處理器與內(nèi)存功率模型的提升非常大,在整機(jī)模型中,模型PM2估測(cè)準(zhǔn)確性也都優(yōu)于PM1.同時(shí)從圖2(a-h)中可以發(fā)現(xiàn)有時(shí)因不可預(yù)知因素(如底層操作系統(tǒng)進(jìn)程等任務(wù))的影響,個(gè)別點(diǎn)的功耗會(huì)產(chǎn)生突變,導(dǎo)致改點(diǎn)絕對(duì)誤差變大.
本文構(gòu)建了兩種整機(jī)系統(tǒng)實(shí)時(shí)功率模型.本文使用了真實(shí)系統(tǒng)Eureqa建模和PosgreSQL系統(tǒng)運(yùn)行TPC-H負(fù)載對(duì)兩種功率模型進(jìn)行驗(yàn)證,其中結(jié)合性能事件、C-States和利用率的通用整機(jī)功率模型優(yōu)于基于利用率與處理器核頻率所建模型.在今后的工作中,為了進(jìn)一步提高整機(jī)系統(tǒng)實(shí)時(shí)功率模型的精度,可以考慮在CPU、內(nèi)存和磁盤(pán)外增加其他部件的功率模型,比如電源、網(wǎng)絡(luò)、主板和風(fēng)扇.