多處理機系統(tǒng)的負載平衡模型設(shè)計
引言
在嵌入式多處理機系統(tǒng)中,經(jīng)常出現(xiàn)這種情況:某些處理機負載過重而另外一些負載很輕,甚至空閑。這種情況無疑降低了整體系統(tǒng)的工作效率。為了提高處理機的利用率和系統(tǒng)并行計算的效率,應(yīng)該把負載過重的處理機上的一部分負載轉(zhuǎn)移到空閑或輕負載處理機上,這就出現(xiàn)了負載分配問題的研究。
簡單的說,負載平衡就是要盡量均勻地分配任務(wù),并盡量減少結(jié)點之間的通信。解決負載平衡問題,通常有靜態(tài)和動態(tài)兩種調(diào)度策略:
①靜態(tài)負載平衡是根據(jù)系統(tǒng)的先驗知識做出決策,運行時負載不能重新分配。
②動態(tài)負載平衡是根據(jù)計算機過程中數(shù)據(jù)項的變化情況,交換系統(tǒng)的狀態(tài)信息來決定系統(tǒng)負載的分配。它具有超過靜態(tài)算法的執(zhí)行潛力,能夠適應(yīng)系統(tǒng)負載變化情況,比靜態(tài)算法更靈活、有效。但是由于必須收集、存儲并分析狀態(tài)信息,因此動態(tài)算法會產(chǎn)生比靜態(tài)算法更多的系統(tǒng)開銷,不過這種開銷和付出常是有所回報的。
本文描述了一種有效的嵌入式多處理機系統(tǒng)的負載平衡模型,通過動態(tài)判斷當前系統(tǒng)的負載情況,自動選擇負載平衡算法,從而使整個系統(tǒng)以盡可能小的附加代價來達到全局的負載平衡。最后,在卡內(nèi)基梅隆大學(xué)的負載平衡測試框架上,搭建仿真環(huán)境進行模擬測試。結(jié)果顯示,該模型能較好地平衡各結(jié)點的負載。
1 負載分配問題的數(shù)學(xué)描述
負載(1oad)是對一個處理機上運行的所有任務(wù)占用資源的衡量,負載指標(1oad index)是對負載進行量化的評價標準,不同的負載指標定義會得出當前時刻處理機不同的負載程度。關(guān)于這個問題,許多學(xué)者提出了他們的看法。
參考文獻的研究表明,一般效果較好的是,將單項指標中的資源隊列長度作為負載指標。參考文獻[4]建議使用資源利用率而不是資源隊列長度作為負載指標。近年來,隨著CPU速度的快速增長。CPU和內(nèi)存通信之間的瓶頸較為突出,內(nèi)存空間的不足可能導(dǎo)致頻繁的頁面交換,這使得訪問延遲大大增加。根據(jù)參考文獻的研究,定義這樣一個負載指標:
定義1 假設(shè)系統(tǒng)由N個處理單元構(gòu)成,記為P0,P1,…,Pn-1。處理單元之間用通信線路連接,每個處理單元的負載記為WORK(i),0≤i≤n-1。
其中,ε和ω為經(jīng)驗調(diào)整系數(shù),Oε≤10,K1ω+∞,ω為足夠大的數(shù);μ、L和M分別是處理機i的CPU利用率、運行隊列長度和處理機i中所有任務(wù)請求的內(nèi)存之和;Mem(i)為處理機i的可用內(nèi)存。
整個系統(tǒng)的總負載為:
系統(tǒng)的平均負載wavg可以簡單認為是:
Wavg=TotalWork/n
定義負載上界為W1=Wavg+ζ,負載下界為W2=Wavg-ζ。其中,參數(shù)ζ視具體系統(tǒng)之不同而定。
有了以上的基礎(chǔ),可以再進一步對各個結(jié)點的負載進行劃分:某個處理單元的負載WORK(i)W1,則為輕載結(jié)點;W1WORK(i)W2的為適載結(jié)點;WORK(i)>W2的為重載結(jié)點;WORK(i)=0的是空載結(jié)點,如圖1所示。
2 嵌入式多處理機系統(tǒng)的動態(tài)負載平衡算法
一般來說,系統(tǒng)中每個結(jié)點上的任務(wù)是動態(tài)產(chǎn)生的,負載大小也是動態(tài)變化的。在完成任務(wù)的過程中,要周期性地檢查任務(wù)完成的情況,并與其他結(jié)點交互這些情況。在此基礎(chǔ)上,按照一定原則確定是否對任務(wù)進行遷移,以及遷移的源、目的結(jié)點和遷移量。
在動態(tài)負載平衡策略中,比較有代表性的算法是輕載結(jié)點請求算法和重載結(jié)點請求算法。在嵌入式多處理機系統(tǒng)中,一般情況下,根據(jù)系統(tǒng)當前的負載情況選用其中之一,可以有效地平衡負載;但是,當系統(tǒng)負載發(fā)生變化后,可能會由于原先選用的算法不合適而導(dǎo)致附加開銷陡增,并且無法有效地平衡負載。因此,考慮到嵌入式系統(tǒng)本身的特點(例如資源有限等),輕載結(jié)點請求算法和重載結(jié)點請求算法不加改進而直接用于嵌入式多處理機系統(tǒng)是不合適的。綜合這兩種算法的優(yōu)缺點,就有了雙向請求算法。
2.1 輕載結(jié)點請求算法
輕負載結(jié)點會嘗試向重載結(jié)點請求任務(wù),每個結(jié)點都定義了相關(guān)域,相關(guān)域的定義是把所有與之相鄰的結(jié)點作為相關(guān)域成員。結(jié)點只與其相關(guān)域中的結(jié)點進行交互和任務(wù)傳遞。如果請求到任務(wù),則中止請求,否則就繼續(xù)詢問下一個相鄰結(jié)點。
啟動時,所有結(jié)點幾乎都是輕載結(jié)點。經(jīng)過一段時間以后,結(jié)點開始檢查自身是否仍是輕載結(jié)點,如果仍是,就試圖在相關(guān)域中找出重載結(jié)點,并請求該結(jié)點上的任務(wù)。具體來說,設(shè)該輕載結(jié)點的負載為WORK(p),相關(guān)域中有k個結(jié)點WORK(a+1)、WORK(a+2)……WORK(a+k),則該部分的平均負載Wavg′為:
為達到任務(wù)的均勻分布,應(yīng)求得相關(guān)域中重載結(jié)點應(yīng)該傳遞給該結(jié)點的負載量(設(shè)為Mk),但是必須對每個結(jié)點引入閾值H(j),以避免任務(wù)從負載更輕的輕載結(jié)點遷移過來。若WORK(j)>Wavg′,則H(j)一WORK(j)一Wavg′;否則,H(j)=0。
然后,該結(jié)點就可以按照計算出的Mk值,向各個相關(guān)結(jié)點發(fā)出接收任務(wù)請求。
輕載結(jié)點請求算法流程如下:
①判斷自己是否為輕載結(jié)點;
②如果是,則找出附近的重載結(jié)點,并對它發(fā)出任務(wù)請求;
③接收到請求算法的重載結(jié)點向該輕載結(jié)點發(fā)送任務(wù)。
輕載結(jié)點請求算法的優(yōu)點是:不需要相互交換負載信息;當每個結(jié)點均處于忙狀態(tài)時,不會有結(jié)點啟動輕載結(jié)點請求算法,幾乎不需要額外調(diào)度開銷;處理負載平衡問題的許多工作是由空閑結(jié)點來完成的,沒有給重載結(jié)點增加太多的額外負擔。
缺點是:在開始和結(jié)束階段時任務(wù)數(shù)相對較少,大量輕載結(jié)點會不斷發(fā)出任務(wù)請求,并且這些請求中的大多數(shù)無法得到滿足,于是許多輕載結(jié)點會繼續(xù)發(fā)出請求。最終,大量的請求增加了系統(tǒng)的額外開銷,影響了系統(tǒng)整體性能,同時大量針對重載結(jié)點的任務(wù)請求會拖延它們本身任務(wù)的執(zhí)行。
在系統(tǒng)整體負載較輕時,使用輕載結(jié)點請求算法反而會造成較大的額外開銷,不利于系統(tǒng)的整體性能。因此,輕載結(jié)點請求算法適合在整個系統(tǒng)負載較重時使用。
2.2 重載結(jié)點請求算法
重負載結(jié)點會嘗試向輕載結(jié)點發(fā)送任務(wù),至于發(fā)送任務(wù)給哪個結(jié)點,則取決于該結(jié)點相關(guān)域中結(jié)點的負載狀態(tài)。因此,該策略需要交換處理器的負載信息。一個結(jié)點有多種方法向鄰接結(jié)點通知它的負載情況,例如定期詢問、當任務(wù)數(shù)發(fā)生變化時、接收到執(zhí)行任務(wù)請求時、響應(yīng)請求或者當任務(wù)數(shù)超過一定閾值時等。
啟動一段時間以后,各結(jié)點開始檢查自身是否是重載結(jié)點,如果是,就試圖在相關(guān)域中均勻地分布任務(wù)。與輕載結(jié)點請求算法類似,首先計算域內(nèi)的平均負載Wavg′,然后計算所要轉(zhuǎn)移的任務(wù)量Mk。
設(shè)該重載結(jié)點的負載為WORK(p),相關(guān)域中有k個結(jié)點WORK(a+1)、WORK(a+2)…… WORK(a+k),則該部分的平均負載Wavg′為:
對每個結(jié)點引入閾值H(j),以避免任務(wù)從負載更輕的輕載結(jié)點遷移過來。若WORK(j)>Wavg′,則H(j)=WORK(j)一wavg′;否則,H(j)=0。則Mk的值為:
然后該結(jié)點就可以按照計算出的Mk值向各個相關(guān)結(jié)點發(fā)送任務(wù)。
重載結(jié)點請求算法流程如下:
①判斷自己是否為重載結(jié)點;
②如果是,則找出附近的輕載結(jié)點,并對它發(fā)出任務(wù)轉(zhuǎn)移請求;
③得到同意后,重載結(jié)點向該輕載結(jié)點發(fā)送任務(wù)。
重載結(jié)點請求的優(yōu)點是:如果沒有過重負載的忙結(jié)點,就不會被空閑鄰接結(jié)點所打擾。這在整個系統(tǒng)負載較輕時顯得尤為重要。
缺點是:負載過重的重載結(jié)點還要額外增加處理負載平衡調(diào)度的負擔。
系統(tǒng)整體負載較重時,如果使用重載結(jié)點請求算法,那么重載結(jié)點在自身已經(jīng)高負荷的情況下,還要負擔額外的處理負載平衡調(diào)度的負擔,發(fā)出任務(wù)轉(zhuǎn)移請求。由于重載結(jié)點數(shù)目較多,多數(shù)任務(wù)轉(zhuǎn)移請求無法得到滿足,重負載結(jié)點會在將來繼續(xù)發(fā)出請求,這些請求反而會造成較大的額外開銷。因此,重載結(jié)點請求算法適合在整個系統(tǒng)負載較輕時采用。
2.3 雙向請求算法
綜合上面兩種算法的優(yōu)缺點,就有了雙向請求算法。發(fā)送者和接收者都能轉(zhuǎn)移任務(wù),因此該算法兼有重載結(jié)點請求算法和輕載結(jié)點請求算法的優(yōu)點。在系統(tǒng)負載較輕時,使用重載結(jié)點請求算法;在系統(tǒng)負載較重時,使用輕載結(jié)點請求算法。
一個需要解決的問題是:怎么樣判斷系統(tǒng)負載的輕與重,即怎樣決定何時使用重載結(jié)點請求算法,何時使用輕載結(jié)點請求算法。這是非常關(guān)鍵的,如果解決得不恰當,那么雙向請求算法就不是結(jié)合重載結(jié)點請求算法與輕載結(jié)點請求算法的優(yōu)點,而是結(jié)合了二者的缺點。
2.4 雙向請求算法的改進
改進算法采用自適應(yīng)算法,合理地設(shè)置判斷負載的閾值,并隨著每個結(jié)點的任務(wù)負荷變化,動態(tài)地改變這個評判標準,在系統(tǒng)負載重時采用輕載結(jié)點請求算法,在系統(tǒng)負載輕時采用重載結(jié)點請求算法。
改進算法中,每個結(jié)點記錄其相關(guān)域中其他結(jié)點的狀態(tài)信息,它維護2個集合,分別是輕載集θ和重載集φ。輕載集中保存的是其相關(guān)域中輕載結(jié)點的信息,而重載集中保存的是其相關(guān)域中重載結(jié)點的信息。每當結(jié)點狀態(tài)發(fā)生變化時,發(fā)消息給相關(guān)域中的各結(jié)點,各結(jié)點相應(yīng)地改變其輕載集和重載集。
比較兩個集合的大小來決定采用重載結(jié)點請求算法還是輕載結(jié)點請求算法。當系統(tǒng)處于重負載時,會有大量的重負載結(jié)點,因而輕載集較小,而重載集較大,那么就采用輕載結(jié)點請求算法,在輕載集中找到接收者,由接收者主動申請結(jié)點的任務(wù);當系統(tǒng)處于輕負載時,會有大量的輕負載結(jié)點,因而重載集較小,而輕載集較大,那么就采用重載結(jié)點請求算法,在重載集中找到發(fā)送者,由發(fā)送者主動遷移任務(wù)給結(jié)點。
各結(jié)點的狀態(tài)分為R(輕載,即任務(wù)接收者)和S(重載,即任務(wù)發(fā)送者),閾值記為Mk。系統(tǒng)剛啟動時,各結(jié)點負載都比較輕(即均為R),因此,重載集合為空,輕載集合則等于結(jié)點全集。當產(chǎn)生新任務(wù)時,只要結(jié)點負載不超過閾值Mk,這個新任務(wù)就在本地運行,結(jié)點狀態(tài)仍舊是R。此時的系統(tǒng)處于低負載,使用重載結(jié)點請求算法。隨著一個個新任務(wù)的到來,結(jié)點負載增大,當超過閾值Mk時,結(jié)點狀態(tài)變?yōu)镾,并通知其他結(jié)點改變它們所維護的重載集與輕載集。
然后,比較結(jié)點輕載集和重載集的大小:若重載集小于輕載集,則繼續(xù)采用重載結(jié)點請求算法,按重載結(jié)點請求算法遍歷其輕載集中的結(jié)點,找出最合適執(zhí)行新產(chǎn)生任務(wù)的結(jié)點,并發(fā)送任務(wù);若重載集大于輕載集,則改用輕載結(jié)點請求算法,按輕載結(jié)點請求算法遍歷重載集中的結(jié)點,并發(fā)送請求任務(wù)的信號。
圖2為改進的雙向請求算法流程。
在嵌入式多處理機系統(tǒng)中,要實現(xiàn)任務(wù)的再次分配,一般是采取進程遷移的方式。但是進程遷移開銷較大,而且選擇可遷移進程的標準和策略是實現(xiàn)動態(tài)搶先式負載平衡的關(guān)鍵問題,若選擇了不該遷移的進程進行遷移,則可能會抵消負載平衡所帶來的性能的改善。
定義2 進程從開始執(zhí)行到最終結(jié)束所花費的CPU周期數(shù)稱為“進程生存周期數(shù)”,進程當前已經(jīng)耗費掉的CPU周期數(shù)稱為“進程已生存周期數(shù)”。
最簡單的方法是選擇最新生成的任務(wù),導(dǎo)致處理器工作負載超出門限值,這些任務(wù)相對來說遷移的代價不大。也可以選擇已運行的任務(wù),然而,可能的結(jié)果是遷移運行任務(wù)的代價抵消了作業(yè)運行時間的減少。因此,選擇生存期長、已生存周期數(shù)較少的進程更有利,可以使遷移開銷有時間得以補償。在本模型中,選擇前一種遷移策略。
仿真測試基于卡內(nèi)基梅隆大學(xué)的負載平衡測試框架,設(shè)置了5個結(jié)點。輸入具有代表性的任務(wù)集之后,分別在系統(tǒng)負載較輕、較重和正常的情況下進行仿真測試。每個結(jié)點的剩余負載能力不同,分別記為:20,90,30,20,40。不妨假設(shè),在負載平衡前,負載是平均分配到5個結(jié)點上的,使用本文中的策略進行負載平衡后,剩余負載能力較強的結(jié)點將負擔更多的負載。由于篇幅所限,這里只能列出部分測試結(jié)果,分別如圖3~圖5所示。
結(jié) 語
負載平衡調(diào)度是嵌入式多處理機系統(tǒng)利用處理器資源的一種有效途徑,它能讓多個處理單元比較平衡地共同承擔一系列繁重的任務(wù),從而大大提高了系統(tǒng)的吞吐率與性能。動態(tài)負載平衡問題是一個正在蓬勃發(fā)展的研究熱點,還有許多未知的問題有待進一步地探索和研究。仿真結(jié)果表明,本文介紹的改進算法有效地平衡了各結(jié)點的負載,提高了整個系統(tǒng)資源的吞吐率與性能。該算法還有待在今后的研究工作中,通過實踐的檢驗,找出該算法所需設(shè)置的參數(shù)(例如閾值Mk和H(j))的合適值。
評論