, ,
(浙江工業(yè)大學 計算機科學與技術學院,浙江 杭州 310023)
計算機能效是當前計算機領域研究的熱點議題之一.隨著云計算與大數(shù)據(jù)時代的到來,數(shù)據(jù)中心的能效問題更加凸顯,大型數(shù)據(jù)中心耗費一座城市的電能.據(jù)統(tǒng)計,數(shù)據(jù)中心的電力消耗以每年15%~20%的速度在增長,大規(guī)模數(shù)據(jù)中心的能源成本快速攀升并迅速超過硬件本身的成本.數(shù)據(jù)中心的能耗成為日益關切的問題,能耗管理成為現(xiàn)代數(shù)據(jù)中心重要的度量與設計標準,已開展了大量研究工作[1-2].在降低能耗方面,古輝等[3]在構建停車場無線傳感網(wǎng)絡過程中,基于某個特定的場景,提出了基于LEACH的簇樹網(wǎng)絡的路由算法改進方法,使節(jié)點能耗有很大的下降.郝平等[4]在自主開發(fā)的能源監(jiān)測系統(tǒng)上提出了利用基于數(shù)據(jù)倉庫的OLAP分析和改進的分層挖掘Apriori算法,并以此建設成一套區(qū)域能耗預警系統(tǒng),從而提高區(qū)域能耗監(jiān)察管理和預警能力.峰值功率是數(shù)據(jù)中心的一個重要因素.在數(shù)據(jù)中心,冷卻與電力供應是根據(jù)峰值功率來設計的,降低峰值功率可以緩解這方面的限制.Felter等[5]通過單獨估算各個耗能部件的峰值功率來估算系統(tǒng)整體峰值功率,根據(jù)對服務器部件前一區(qū)間的活動檢測來預測下一區(qū)間活動情況,而由此根據(jù)事先分配的功率來確定處理器、內(nèi)存的節(jié)流閾值,限制各部件的活動來進行功率調(diào)節(jié).Meisner等[6]為解決數(shù)據(jù)中心的功率封頂開展了數(shù)據(jù)中心峰值功率建模,功率封頂是數(shù)據(jù)中心對服務器設置功率消耗上限的技術,通過CPU利用率與轉(zhuǎn)換模式功率供給單元間的關系,建立數(shù)據(jù)中心的峰值功率估算模型.但在數(shù)據(jù)庫系統(tǒng)應用中,各個部件不會同時達到峰值點,系統(tǒng)供能超額配置.Chen 等[7-8]分別從進程以及函數(shù)級對功率進行了評估;楊良懷等[9]考察了CPU、內(nèi)存、外存和CPU執(zhí)行頻率等因素,對數(shù)據(jù)庫服務器系統(tǒng)整機系統(tǒng)進行功率建模,構建其軟功率計,考察的是實時功率.由于峰值功率是并發(fā)操作最大聚集和,在查詢執(zhí)行中需要捕捉猝發(fā)或短期功率現(xiàn)象,評估峰值功率需要獲取CPU瞬時利用率,而CPU瞬時利用率在操作執(zhí)行過程中才能獲取,因此這項指標不能用于預測峰值功率.
數(shù)據(jù)庫系統(tǒng)是數(shù)據(jù)中心的核心軟件之一,對其峰值功率的感知與控制具有重要的意義.獲取數(shù)據(jù)庫系統(tǒng)查詢操作的峰值功率是通過實際測量獲取峰值和通過軟件評估的兩種方式預測峰值.對于功率感知查詢優(yōu)化器,需要在查詢執(zhí)行前選擇具有合適峰值功率的查詢計劃,無法事先測量,通過軟件評估的方式預測峰值功率才是可行方案.Kunjir等[10]剖析了3個商用數(shù)據(jù)庫系統(tǒng)的峰值功率行為,查詢處理中峰值功率有時相當大,可以覆蓋計算平臺整個動態(tài)范圍,其實驗結果表明峰值功率的行為與相應的平均功率行為大為不同,需要對這兩個指標分別進行研究;同一查詢,不同商用數(shù)據(jù)庫系統(tǒng)峰值功率差別很大,說明對峰值功率的控制是數(shù)據(jù)庫系統(tǒng)可一進行決策的參數(shù).Yang等[11]在串行操作方式下針對查詢操作中的連接算法,在不同頻率下建立了峰值功率評估模型,并用4種連接算法進行了驗證,取得了一定的準確性.數(shù)據(jù)庫系統(tǒng)中為改善連接算法的性能通常是基于異步I/O方式實現(xiàn)的,如何解決異步I/O連接算法的峰值功率建模問題成為熱點.
查詢處理器需要在系統(tǒng)運行前知道操作可能產(chǎn)生的功耗.峰值功率中需要對并行操作顯式處理,峰值功率是并發(fā)操作最大聚集和,運行時CPU利用率是一個密切相關指標.但CPU利用率是運行時指標,無法用于峰值功率建模,需要找到一個類似CPU利用率的綜合指標來估算峰值功率,即使用CPU密集度指標來建立峰值功率估算模型.
Yang等[11-12]都引入了CPU密集度的概念,區(qū)別在于后者所考慮的負載特征中,CPU運行狀態(tài)只包括CPU計算密集型與內(nèi)存訪問密集型兩種,而前者把操作算法運行中,I/O訪問密集型也考慮進CPU的狀態(tài)中.CPU的運行狀態(tài)可細分為4種:CPU運算、訪問內(nèi)存、訪問外存(I/O)和空閑.前3種統(tǒng)稱為活動態(tài).從功率評估的角度來看,CPU在不同狀態(tài)所消耗功率不同,若在不同狀態(tài)的時間能夠進行估算,則可以近似計算計算相應算法的功率消耗.對于數(shù)據(jù)庫連接操作,通過功耗儀測量實際運行的功率可知,CPU在運算和訪問內(nèi)存這2種狀態(tài)下功率基本一致,而與IO訪問時的功率差別較大,其原因是CPU為系統(tǒng)主要的耗能部件,前2種狀態(tài)CPU的利用率較高,而訪問外存對CPU的利用率較低,因此把CPU運算、訪問內(nèi)存這兩種狀態(tài)統(tǒng)稱為CPU密集型.采用CPU密集度定義,即在單位時間(1 s)內(nèi)CPU密集型時間所占比率(CPU密集型時間+I/O密集型時間=1 s),CPU密集度計算式為
(1)
式中:Bcpu為CPU密集度;tcpu為CPU密集型操作的時間;T為單位時間.計算CPU密集度的關鍵在于對tcpu的估算,而tcpu的估算與操作的負載特征相關.
在軟硬件配置不變的情況下,算法的峰值功率產(chǎn)生階段是不變的,連接算法的峰值功率產(chǎn)生在連接階段.合理使用異步I/O可以減少CPU等待數(shù)據(jù)的阻塞時間,故使用異步I/O來實現(xiàn)的塊嵌套循環(huán)連接(BNLJ)算法為例來說明峰值功率的估算.
假設連接的兩個關系表設為R表和S表.令|R|與|S|分別表示兩個關系表的大小,且設|R|<|S|;磁盤I/O基本單位為數(shù)據(jù)塊,|IB|表示輸入緩存大小,即S表1次讀入的數(shù)據(jù)塊大?。粅OB|表示輸出緩存大小,即連接結果一次寫出到磁盤的數(shù)據(jù)塊大?。籖blk表示R表每次讀入到緩存的大?。豢捎每偩彺娲笮镸.
基于異步I/O方式實現(xiàn)的連接算法采用傳統(tǒng)雙緩存機制.輸入緩存由兩部分組成,分別用IB和IB'表示,它們的大小都用|IB|表示,其中IB區(qū)表示正在進行CPU密集型操作的緩存區(qū),而IB'區(qū)表示正在讀入元組的緩存區(qū);同理,輸出緩存也由兩部分組成,分別用OB和OB'表示,它們的大小都用|OB|表示,其中OB區(qū)表示正在寫入結果的緩存區(qū),而OB'區(qū)表示正在將結果寫出到磁盤的緩存區(qū).在某些情況下,IB區(qū)和OB區(qū)分別也可以進行CPU密集型操作和寫出操作,即當IB'區(qū)還在進行讀入操作時,而IB區(qū)已完成CPU密集型操作,這時將會阻塞,IB區(qū)可同時進行讀入操作;同理,當OB'區(qū)還在進行寫出操作時,而OB區(qū)已完成結果的寫入操作,這時也會阻塞,OB區(qū)可同時進行寫出操作.
單位時間內(nèi)tcpu的長短與讀和寫數(shù)據(jù)塊的時間密切相關,因此需要估算讀、寫操作的耗時.設磁盤的輸入、輸出速率分別為γi,γo;讀入|IB|大小的數(shù)據(jù)塊所需的時間Tr=|IB|/γi,寫出結果的時間Tw=|OB|/γo.其次,需要估算CPU密集型操作的耗時.
對于BNLJ算法,最理想的狀態(tài)是兩個關系都可以完全讀入到內(nèi)存中并進行連接操作,這時其性能可以達到最高.但由于內(nèi)存有限,小表R往往不能一次性讀入到可用內(nèi)存中,需要通過分割成多個數(shù)據(jù)塊多次讀入內(nèi)存來進行.基于異步I/O實現(xiàn)的BNLJ算法基本流程是:先確定輸入緩存大小|IB|和輸出緩存大小|OB|,將R表的一部分讀入緩存中并構建其哈希表;然后將S表循環(huán)讀入輸入緩存IB和IB'區(qū)進行連接操作,連接結果放入輸出緩存OB和OB'區(qū),最后輸出到磁盤中;遍歷完S表后(內(nèi)層循環(huán)結束),清理原先讀入的一部分R表并讀入新的一部分,重復以上操作,直至將小表R完全遍歷(外層循環(huán)結束).
元組在連續(xù)的連接過程中不訪問外存,是CPU密集型操作;但在連接過程中,元組連接速度很快,且輸入輸出緩存大小有限,在所考察的單位時間T內(nèi)可能會發(fā)生I/O,即從磁盤中讀入S表/R表或?qū)懗鲞B接結果到磁盤,而這兩種操作皆為IO密集型操作,所以tcpu為單位時間內(nèi)連接元組的時間長度.由于需要估算CPU密集型操作的耗時,故設連接|IB|大小的數(shù)據(jù)塊所需的時間設為Tij,連接結果填充滿|OB|大小的輸出緩存所需的連接時間設為Toj.
估算BNLJ的連接時間tcpu時,筆者采用單位時間內(nèi)連接元組數(shù)N與平均每對元組連接用時的乘積來計算.元組在連接時分兩種情況,一種是元組探測后找到可連接元組,并進行連接;另一種是元組探測后發(fā)現(xiàn)沒有匹配的連接對象,直接丟棄.因此,估算連接時間時需要對這兩種操作進行區(qū)分.假設輸入緩存IB或IB'中可與Rblk元組進行連接概率為P,其估計可以根據(jù)關系R與S在連接屬性Y上相等的概率為1/max(V(R,Y),V(S,Y))計算,其中V(*,Y)表示某關系在屬性Y取相異值的個數(shù),則輸入緩存IB或IB'連接所需要的時間計算式為
Tjoin(P,Njoin)=NblkR·Njoin·Tprobe+
P·Njoin·Tjoin
(2)
式中:NblkR為Rblk包含的元組數(shù);Njoin為單位時間里連接S表的元組數(shù);Tprobe,Tjoin分別為探測和連接.
式(2)中直接確定連接總元組數(shù)Njoin比較困難,在每次讀入輸入緩存后,通常連接過程會遇到兩種情況:1) 連接結果未填滿輸出緩存區(qū),而輸入緩存區(qū)的元組已經(jīng)完成連接,必須從磁盤讀數(shù)據(jù)至輸入緩存;2) 連接結果填滿輸出緩存區(qū),必須對其進行輸出.由于連接過程可能是非連續(xù)的,為了計算Njoin則必須重現(xiàn)連接的邏輯過程,對整個單位時間里的連接元組數(shù)量進行累計,為此需設計相應算法進行處理.
在提出算法之前,還需要估算Tij和Toj兩個參數(shù).評估這兩個參數(shù)需要分別確定|IB|大小數(shù)據(jù)塊中包含的元組數(shù)量NblkS和產(chǎn)生|OB|大小的連接結果所需連接元組條數(shù)NS-needed.假設元組大小均勻分布,R表與S表的平均元組大小分別表示為|tR|與|tS|,則NblkR與NblkS分別為Rblk/|tR|,|IB|/|tS|;由于連接是將兩條元組進行拼接,對應產(chǎn)生的結果大小可表示為|tR|+|tS|,再結合連接概率為P,則NS-needed計算式為
(3)
由式(2,3)可得:Tij=Tjoin(P,NblkS),Toj=Tjoin(P,NS-needed).
按照CPU密集度的定義,峰值階段從不同的起始位置取單位時間間隔得到的CPU密集型操作時間長短不同,即CPU密集度不一樣,而功率測量值是單位時間的積分值.故從理論上來說,峰值功率對應操作執(zhí)行過程中CPU密集度最大點,對峰值功率對應的CPU密集度的估算需要選擇使CPU密集度最大的起始點.
評估連接算法的峰值功率就是找出算法執(zhí)行過程中CPU密集度最大的單位時間段.對此,有以下命題:
命題在無I/O阻塞情況下,形成最大CPU密集度的單位時間段起始點在輸入緩存區(qū)IB讀取完成,且IB'讀取完成的時刻不晚于IB連接完成的時刻.
證明首先證明起始點是在輸入緩存區(qū)IB讀取完成時.假設起始點不在輸入緩存區(qū)IB讀取完成時,即當前IB未讀取完數(shù)據(jù),那么單位時間內(nèi)必定有段時間是要等待其完成讀入,CPU密集度無法達到最大,故起始點是在輸入緩存區(qū)IB讀取完成時.其次證明由于IB'讀取完成的時刻不晚于IB連接完成的時刻.由于使用雙緩存形式來實現(xiàn)基于異步I/O的BNLJ連接算法,故在整個連接過程中,IB和IB'會不斷重復地進行“讀取數(shù)據(jù)-連接”循環(huán)操作.當IB區(qū)完成連接時,若IB'區(qū)未完成讀入,則會阻塞一段時間,在單位采樣時間內(nèi),將會有段時間用于I/O操作.對于IB'而言,就相當于其計算密集度的起始時間前移.因此,IB'讀取完成的時刻不晚于IB連接完成的時刻.綜合上述情況,可得出在無I/O阻塞情況下,形成最大CPU密集度的單位時間段起始點在輸入緩存區(qū)IB讀取完成,且IB'讀取完成的時刻不晚于IB連接完成的時刻這一結論.
CPU密集度估算需用到幾個變量:tij為完成IB未連接部分預計需要的連接時間,根據(jù)前述命題,最大CPU密集度發(fā)生在輸入緩存IB讀取完成后,因此tij初始值賦為Tij;toj為填滿輸出緩存OB剩余空間預計需要的連接時間,由于輸出緩存初始為空,因此toj初始值賦為Toj;tir為從磁盤讀取數(shù)據(jù)填滿IB剩余空間預計所需的讀取時間,同理根據(jù)最大CPU密集度發(fā)生在輸入緩存讀取完成后,tir初始值賦為0;tow為完成OB未寫出部分預計所需的寫出時間,由于一開始輸出緩沖區(qū)為空,故tow初始值賦為0;tr為從磁盤讀取數(shù)據(jù)填滿IB'剩余部分所需的讀取時間,根據(jù)命題IB與IB'一開始可以同時異步讀取完成,故tr初始值賦為0;tw為完成OB'未寫出部分所需的寫出時間,由于一開始輸出緩沖區(qū)為空,故tw初始值賦為0.由于CPU密集度定義為在單位時間(1 s)內(nèi)CPU密集型操作時間所占的比率,故引入表示剩余運行時間的變量tleft,初值賦為1 s.
得到上述參數(shù)后,可以進行模擬BNLJ連接算法峰值功率產(chǎn)生階段的執(zhí)行過程.算法在連接階段的基本流程為:初始狀態(tài)時IB和IB'已完成讀取,可進行連接操作;OB和OB'為空,可進行連接結果的寫入操作.IB進行連接時,將其連接結果寫入OB,使用異步I/O的方式實現(xiàn)算法,故與此同時可進行IB'的讀入與OB'的寫出,要分別更新兩者的時間tr和tw.當IB的元組完成連接時,若IB'已完成讀入,則交換IB與IB',繼續(xù)進行連接;否則,阻塞.同理,當OB被連接結果填滿時,若OB'已完成寫出,即已可用,則交換OB與OB',繼續(xù)進行連接;否則,阻塞.
連接過程中將會出現(xiàn)3種阻塞情況:
1) 當IB完成連接操作,而IB'還未完成讀取操作,其阻塞時間取決于IB'的tr時間;
2) 當OB完成連接結果的寫入操作,而OB'還未完成寫出操作,其阻塞時間取決于OB'的tw時間;
3) 當上述2種情況同時存在,即當IB'未完成讀取且OB'未完成寫出造成阻塞,其阻塞時間為tr和tw兩者中的較長者.阻塞時,只進行I/O操作.
給定參數(shù)上述參數(shù)后,可對tcpu進行估算.CPU密集度最大的單位時間段的計算算法,見算法ComputeAIO-tcpu.
算法1ComputeAIO-tcpu
輸入:|IB|,|OB|;輸出:單位時間中CPU密集型操作的時間tcpu.
1) 初始化CPU占用時間tcpu←0,單位時間1 s中所剩余時間tleft←1,完成連接輸入緩存IB中元組所需時間tij←Tij,填滿輸出緩存OB所需連接時間toj←Toj,讀取IB'未讀入部分所需時間tr←0,讀取IB未讀入部分所需時間tir←0,寫出OB'未寫出部分所需時間tw←0,以及寫出OB區(qū)未寫出部分所需時間tow←0.
2) 判斷tleft是否大于0,若是則轉(zhuǎn)至步驟3),否則終止并輸出tcpu.
3) 若剩余時間tleft足夠連接完IB,轉(zhuǎn)至步驟4),否則轉(zhuǎn)至步驟8).
4) 若IB連接的結果不夠填滿OB,則轉(zhuǎn)至步驟7),否則轉(zhuǎn)至步驟5).
5) 若IB連接的結果多于填滿OB所需的量,則將IB的部分元組進行連接(tij←tij-toj),與此同時,可異步進行IB'的讀入(Update(tr,toj))與OB'的寫出(Update(tw,toj)),直到連接結果填滿OB為止(tow←Tw),更新tcpu←tcpu+toj和tleft←tleft-toj,獲取可用的輸出緩存(getEmptyOB())并記為OB,重復步驟2),否則轉(zhuǎn)至步驟6).
6) 若IB連接的結果剛好填滿OB,更新tcpu←tcpu+toj和tleft←tleft-toj,與此同時,可異步進行IB'的讀入(Update(tr,toj))與OB'的寫出(Update(tw,toj)),直到IB連接完成并且連接結果填滿OB為止(tir←Tr,tow←Tw).若IB'的未讀入部分所需時間比OB'未寫出部分所需時間短,即阻塞等待OB'完成寫出,先獲取可用的輸入緩存(getReadyIB())并記為IB,再獲取可用的輸出緩存(getEmptyOB())并記為OB;否則,阻塞等待IB'完成讀入,先獲取可用輸出緩存并記為OB,再取可用的輸入緩存并記為IB,重復步驟2).
7) 連接IB的所有剩余元組(toj←toj-tij),與此同時,可異步進行IB'的讀入(Update(tr,tij))與OB'的寫出(Update(tw,tij)),直到完成IB連接(tir←tr),更新tleft←tleft-tij和tcpu←tcpu+tij,獲取可用的輸入緩存(getReadyIB())并記為IB,重復步驟2).
8) 若剩余時間tleft足夠連接填滿OB,則將IB剩余部分元組進行連接(tij←tij-toj),與此同時,可異步進行IB'的讀入(Update(tr,toj))與OB'的寫出(Update(tw,toj)),直到連接結果填滿OB為止(tow←tw),更新tleft←tleft-toj和tcpu←tcpu+toj,獲取可用的輸出緩存(getEmptyOB())并記為OB,重復步驟2).否則轉(zhuǎn)至步驟9).
9) 即剩余時間tleft不夠連接完IB且不夠連接填滿OB,將IB的部分元組進行連接,連接結果寫入OB,更新tcpu←tcpu+tleft,直到tleft←0.
算法2Update(t,tp)
輸入:t,tp;輸出:緩存區(qū)剩余讀/寫所需時間t.
1) 若tp小于等于緩存區(qū)剩余讀/寫所需時間t,則更新t←t-tp,否則轉(zhuǎn)至步驟2).
2) 緩存區(qū)剩余讀/寫所需時間t←0.
算法3getReadyIB()
輸入:tleft,tr,tir,tw,tow;輸出:可用的輸入緩存IB,tleft.
1) 判斷IB'是否讀取完整,若是則轉(zhuǎn)至步驟5),否則轉(zhuǎn)至步驟2).
2) 判斷剩余時間tleft是否足夠讀取填滿IB',若是則轉(zhuǎn)至步驟3),否則轉(zhuǎn)至步驟4).
3) 將元組讀取填滿IB',與此同時,可異步進行IB的讀入(Update(tir,tr)),OB和OB'的寫出(Update(tw,tr) , Update(tow,tr)),更新tleft←tleft-tr,轉(zhuǎn)至步驟5).
4) 剩余時間tleft不夠讀取填滿IB',則tleft←0,轉(zhuǎn)至步驟5).
5)IB'已讀取完整,則交換IB與IB',更新IB'未連接部分時間tr←tir,IB未連接部分時間tir←0.
算法4getEmptyOB()
輸入:tleft,tr,tir,tw,tow;輸出:可用的輸出緩存OB,tleft.
1) 判斷OB'是否完成寫出,若是則轉(zhuǎn)至步驟5),否則轉(zhuǎn)至步驟2).
2) 判斷剩余時間tleft是否足夠?qū)懗鯫B',若是則轉(zhuǎn)至步驟3),否則轉(zhuǎn)至步驟4).
3) 將OB'數(shù)據(jù)進行寫出,與此同時,可異步進行IB和IB'的讀入(Update(tr,tw) , Update(tir,tw)),OB的寫出(Update(tow,tw)),更新tleft←tleft-tw,轉(zhuǎn)至步驟5).
4) 剩余時間tleft不夠完成OB'寫出,則tleft←0,轉(zhuǎn)至步驟5).
5)OB'已完成寫出,則交換OB與OB',更新OB'未寫出部分時間tw←tow,OB未寫出部分時間tow←0.
峰值功率對應于算法執(zhí)行過程中CPU密集度最大點,在測量數(shù)據(jù)過程中峰值功率對應的實際起始點與理論起始點可能會略有偏差,考慮到測量的準確性,對測量進行多次重復,為了避免偏差較大的值干擾,取每組測量所得的眾數(shù)作為測量結果.為產(chǎn)生不同CPU利用率的人工負載,對BNLJ算法進行改造,通過控制讀入數(shù)據(jù)塊(多次重復連接同一塊數(shù)據(jù)),改變連接結果輸出緩存的大小,從而產(chǎn)生不同大小的CPU密集度,據(jù)此進行CPU密集度與峰值功率關系的建模.
計算機空閑態(tài)功率是維持各個部件正常運行的基本功率,不同執(zhí)行頻率下對應的空閑態(tài)功率相同,這部分功率作為靜態(tài)功率.為了更直觀地表示算法執(zhí)行狀態(tài)對功率的影響,在構建功率模型時將去除這部分功率,即用測量得到的整機功率減去靜態(tài)功率所得到的動態(tài)功率作為測量功率在圖表中進行展示.測量人工負載在不同CPU密集度時在不同頻率下(2.8,3.1,3.3 GHz)其峰值功率的大小,得到峰值功率與CPU密集度(Bcpu)關系如圖1所示.
圖1 不同頻率下CPU密集度與峰值功率關系Fig.1 The relationship between CPU-boundedness and peak power with varying frequencies
由圖1可知:不同頻率下,峰值功率隨CPU密集度變化呈現(xiàn)了3個階段.CPU密集度在第1階段時處于平穩(wěn)狀態(tài),其原因是算法運行時必須要耗費一定的能量才能維持基本的運行,所以在這個階段呈現(xiàn)平穩(wěn)趨勢;CPU密集度在第2階段時處于較為明顯的上升狀態(tài);CPU密集度在第3階段時又處于平穩(wěn)狀態(tài),其原因是CPU被不斷請求操作,在機器耗能尚未瞬間降低時,而新的請求又到達,從而導致CPU一直處于高耗能狀態(tài).可見CPU密集度對峰值功率的影響只是在一定范圍內(nèi)呈現(xiàn)正相關的關系.為此,先針對CPU執(zhí)行頻率為3.3 GHz的情況對CPU密集度與峰值功率進行建模,使用建模工具Eureqa對獲得的測量數(shù)據(jù)進行回歸建模,擬合曲線時可以選取不同類型的運算和不同的擬合曲線,選取常數(shù)C,變量x,+,-,×,/,power函數(shù)和logistic函數(shù).經(jīng)過多種模型的嘗試,選取模型為
P=4.69+6.58×logistic(45.8×Bcpu-13.6)
(4)
式(4)擬合的均方根誤差RMSE(Root-mean-square error)為0.351,模型擬合CPU密集度與峰值功率關系如圖2所示,CPU密集度取值范圍為0.13~1.
圖2 不同模型的峰值功率預測Fig.2 Peak power prediction by different models
對不同頻率下的CPU密集度與功率之間的關系仍然采用上述方法進行擬合,分別得到的標準誤差RMSE均在0.37以內(nèi),整體模型用抽象形式表示,即在頻率為f時峰值功率P與CPU密集度Bcpu之間的關系,即
Pf=α+β×logistic(γ×Bcpu-δ)
(5)
式中:α,β,γ,δ分別為常數(shù)參數(shù),各頻率下的常數(shù)參數(shù)值與RMSE值如表1所示.
表1不同頻率下預測模型的參數(shù)值及RMSE值
Table1ParametersandRMSEofpredictmodelsunderdifferentCPUfrequency
f/GHzαβγδRMSE3.34.696.5845.813.60.3513.14.676.7555.320.40.3642.810.3-5.56-79.5-24.20.359
為了評價第1節(jié)中預測模型的準確性,采用C++以及異步I/O機制實現(xiàn)了BNLJ算法,對BNLJ配置不同緩存,得到21組不同值的CPU密集度,用功耗儀測量不同CPU密集度時對應的峰值功率,比較峰值功率的實際值與預測值的相對誤差來評價模型準確性.功耗儀采樣率1 Hz.
實驗環(huán)境采用的硬件配置以及軟件版本如表2所示.
表2 實驗環(huán)境Table 2 Experimental environment
實驗涉及到CPU密集度的計算,給定具體的參數(shù)|R|,|S|,|IB|,|OB|,Rblk后,針對實驗環(huán)境需要確定1.1節(jié)中各個待定參數(shù)γi,γo,|tR|,|tS|,P,Tprobe,Tjoin.使用Iometer工具對硬盤進行測量,得出磁盤I/O速率在不同塊大小下的速率統(tǒng)計表如表3所示.
表3 磁盤I/O速率統(tǒng)計Table 3 The statistics of disk I/O rate
實驗中連接的兩張表采用TPC-H測試基準規(guī)模5產(chǎn)生的CUSTOMER(對應前面的R表,大小為129 MB,元組數(shù)NR=750 000)和ORDERS(對應前面的S表,大小為948 M,元組數(shù)NS=7500 000),作為連接算法的負載.經(jīng)過估算R表與S表的平均元組大小|tR|與|tS|都均為170字節(jié).
由數(shù)據(jù)表的分布特征可知max(V(R,Y),V(S,Y))為NR.對BNLJ算法而言,通常由于|R|>M而將R表分割多次讀入,故每趟讀入的Rblk<|R|,則S表與Rblk的連接概率P為NblkR/NR,其中Rblk大小為(M-2·|IB|-2·|OB|)/F.
通過連接探測或連接大量的元組對Tprobe和Tjoin估算,用測得的總時間除以連接的元組對數(shù)得到每對元組探測和連接排序的平均時間.筆者對2種頻率下的數(shù)據(jù)進行測量,結果如表4所示.
表4 元組探測和連接時間統(tǒng)計Table 4 Time of probe and join
在獲取以上參數(shù)后,便可以根據(jù)BNLJ運行時的軟硬件配置環(huán)境計算得到21組不同的CPU密集度.利用21組輸入輸出緩存大小對BNLJ算法進行配置,測量對應的峰值功率,與模型預測值進行對比.兩種頻率的驗證結果如圖3所示,不同CPU頻率下模型的平均相對誤差如表5所示.
圖3 不同頻率下峰值功率實際值與預測值對比Fig.3 The comparison of real and predict values
f /GHz2.83.13.3平均相對誤差/%3.753.943.27
由實驗結果可知:各個算法在不同頻率下的平均相對誤差范圍在4%以內(nèi),說明具有一定的準確性.
針對功率感知數(shù)據(jù)庫系統(tǒng)中連接算法的峰值功率建模問題,使用了CPU密集度指標作為CPU功率的指示量,建立了基于異步I/O方式實現(xiàn)的連接算法的峰值功率預測模型,并對其進行了實驗驗證,結果表明:預測模型具有較好的準確性,其平均相對誤差小于4%.數(shù)據(jù)庫系統(tǒng)可采用此方法對查詢操作各個算法的峰值功率進行評估,在連接算法執(zhí)行之前只需給定數(shù)據(jù)庫統(tǒng)計信息以及當時系統(tǒng)配置信息,便可以估算峰值功率產(chǎn)生階段的CPU密集度來預測相應的峰值功率,可用于功率感知數(shù)據(jù)庫系統(tǒng)的查詢處理與優(yōu)化.