RAVDC算法的輸入參數有三個,分別是G(V,A)、Gk(Vk,Ak)和R(i)。
RAVDC算法的主要步驟分為三步:
步驟1
利用租戶給定的可靠性需求R(i)計算出虛擬機整合門限K(如式(2)所示)。K表示VDC在單個服務器上最多能部署的VM個數,通過K可以確保單個物理服務器失效隻影響租戶VDC的少量VM,從而保障租戶VDC的可靠性需求。
步驟2
基於門限K,從U中找一個大小為K的最好分組P(P中含有VM個數為K)。通過式(5)來計算一個分組的好壞程度。分組越好表示分組需要消耗的帶寬越少,所以找最好分組可以保證分組之間的通信量最少,從而減少物理數據中心網絡的帶寬消耗。
步驟3
把得到的最好分組P整合映射到一個開啟且滿足需求的服務器上,同時映射分組P中VM與M中VM之間的所有虛擬鏈路。若映射失敗,則開啟一個新服務器來重新映射。這可以減少開啟的服務器數目,從而降低數據中心服務器能耗。
RAVDC算法循環執行步驟2、3,直到VDC所有的VM和VM之間的虛擬鏈路全部被映射成功。通過這種機製,RAVDC算法可以在保證可靠性的同時,減少帶寬消耗、降低服務器能耗。
其偽碼如算法1所示。
2.1 找分組
RAVDC算法的第二步是找分組,由於分組內部的各個VM之間的虛擬鏈路不產生帶寬消耗,所以應當把相互之間帶寬需求大的VM合並在同一個分組中。找分組的主要方法是從U中的每個VM出發,使用貪婪圖增長(Greedy Graph Growing,GGGP)算法[8]計算出一個分組P(PU),然後從所有這些分組中找OB(OB的計算公式如式(5))最小的分組作為最好分組。
GGGP算法的基本流程是從一個VM s開始,先把s加入P(初始時,P=)中,然後計算s的所有在Q(Q=U-P)中的鄰接VM v的增益gv(增益的計算如式(4))。gv表示VM v從分組Q移動到分組P之後,帶寬需求的減少量。接著將擁有最大增益的VM加入到分組P中。當一個VM被加入到分組P中時,同時計算它的所有在Q中的鄰接VM的增益,然後從所有計算了增益的VM中找到具有最大增益的VM加入分組P,如此循環,直到分組P的大小為K時停止。
OBP越小,表示分組P內的VM出分組的帶寬需求越小,這些VM合並部署能盡量減少服務器之間的帶寬消耗,所以分組P越好;同理,OBP越大,表示該分組越差。RAVDC算法通過找OB最小的分組,可以把相互之間帶寬需求量大的VM合並映射,從而減少數據中心的帶寬消耗。
有兩種情況會導致GGGP算法無法找到一個大小為K的分組P。一是|U|
2.2 映射分組
當找到一個最好分組之後,RAVDC算法需要映射該分組。RAVDC算法在映射分組時,在每個服務器上最多隻映射一個分組,無論這個分組的大小如何。如果一個服務器上已經部署了一個分組,則稱該服務器在當前VDC的映射過程中已被使用,並且在之後的映射過程中不再考慮該服務器。
RAVDC算法使用最優匹配法來映射最好分組P,在映射P之前會先使用OBP進行服務器前向檢查。令pli表示服務器i到其連接的數據中心TOR交換機之間的物理鏈路的剩餘帶寬容量。服務器前向檢查的詳細過程如下:首先得到當前VDC映射過程中開啟且未使用的服務器集合US,然後對服務器i(i∈US)進行檢查,檢查pli是否能滿足OBP的需求,如果能滿足需求且i不在禁止使用的服務器集合FS中,則把i加入到候選服務器集合CS中。然後RAVDC對得到的CS按照pli(i∈CS)升序排列,並從CS中選擇具有最小pli的服務器i來映射P。如果映射失敗,則從CS中選擇具有次小pli的服務器來映射P。通過使用服務器前向檢查機製,可以提前發現失敗,減少算法的運行時間。
在計算算法的運行時間時,除了考慮算法正常執行時所花費的時間外,還需要考慮重新映射所花費的時間。為了提高VDC的映射成功率,VDC映射算法通常需要在失敗時考慮重新映射。發生失敗的次數越多,算法所花費的時間越長。在2EM算法[6]中,失敗發生的主要原因在於2EM算法隻使用待映射VM和與它鄰接且已映射的VM之間虛擬鏈路的帶寬需求來進行前向檢查,檢查服務器的pl是否滿足這些鏈路的帶寬需求之和。這就使得雖然VM i映射成功,但在下一次映射VM i的鄰接VM j時,如果把VM j映射到與VM i所在服務器不同的服務器上,就會很容易發生虛擬鏈路映射失敗。失敗的原因是VM i所在服務器的pl無法滿足VM i與VM j之間虛擬鏈路的帶寬需求。而RAVDC算法在一個服務器上隻映射一個分組,並通過找pl滿足分組OB的服務器來映射分組,OB是分組與所有剩下的VM(包括已映射和未映射VM)之間的虛擬鏈路帶寬需求之和,這就使得造成2EM算法大量失敗的原因不會造成RAVDC算法失敗,從而極大減少失敗發生的次數,減少RAVDC算法的運行時間。
如果分組P映射成功,則使用Kshortest算法[6]映射P中的VM與M中的VM之間的所有虛擬鏈路。Kshortest算法會計算所有服務器對之間的多條最短路徑,RAVDC從這些最短路徑中選擇剩餘帶寬最小且能滿足虛擬鏈路帶寬需求的一條路徑來映射虛擬鏈路,通過這種選擇方式可以充分利用底層物理網絡的帶寬資源。
如果直到CS為空,也不能成功映射,則執行簡單的回退機製——遞減K,重新找一個更小的分組進行映射。通過遞減K,可以盡最大可能地利用現有資源。如果當K已經遞減到1時,所找的分組也映射失敗,則開啟一個新的服務器,然後重新找一個大小為初始K值的分組並重新映射。如果開啟一個新服務器仍然不能成功映射一個分組,則認為已映射分組的映射是不合理的,即不應該把這些分組映射到當前它們所在的服務器上。因為此時失敗的原因是雖然已映射分組所在服務器i的pli能滿足分組的OB需求,但卻由於服務器i與其他服務器之間路徑上的中間鏈路(非服務器與TOR交換機之間的鏈路)非常繁忙,即剩餘帶寬容量太少,而不能成功找到滿足該分組與後續分組之間虛擬鏈路帶寬需求的路徑。所以如果繼續把已映射分組留在這些服務器上,將不能成功映射VDC,最終隻有拒絕該VDC請求。所以為了提高VDC映射的成功率,RAVDC此時會把已映射分組所在服務器加入禁止使用的服務器集合FS中,然後把M清空,並重新在所有服務器i(iFS)上再次映射VDC。如果開啟新服務器失敗,即數據中心中的所有服務器已開啟,則認為該VDC映射失敗。RAVDC算法通過盡量把VM映射到已開啟的服務器上,可以減少開啟的服務器數目,從而降低數據中心的服務器能耗。
3 仿真與分析
3.1 仿真環境設置
仿真使用128個服務器、80個交換機的胖樹結構[9]作為數據中心拓撲。
為了評估數據中心的總能耗(數據中心總能耗由交換機能耗[10]和服務器能耗[11]兩部分組成),需要為數據中心交換機和服務器設置能耗參數。使用EP(Energy Proportionality)無準確統一的中文名稱為0.5的服務器[12]作為數據中心服務器。由於CPU能耗在服務器能耗中所占比例最大,所以在仿真時隻考慮CPU能耗。
VDC的拓撲從星型拓撲、mesh拓撲、二叉樹拓撲和隨機連通圖中隨機選擇。VDC大小分布在 [9,14]區間內。每個VM的計算資源大小(vCPU的數量)分布在[2,4]區間內;每條虛擬鏈路的帶寬資源大小分布在[2,6]區間內,單位是10Mb/s。
用RAVDC算法與現有的以節能為目標的2EM算法進行比較,由於原有的2EM算法不感知租戶的可靠性需求,因此需要對2EM算法進行改進,讓其能感知可靠性需求。為了方便區分,稱改進後的2EM算法為可靠性感知的2EM(Reliabilityaware 2EM,RA2EM)算法。改進方法如下:在用2EM算法進行VDC映射時,每次映射一個VM到物理服務器之前首先判斷該服務器上屬於該VDC的VM數量是否已達到可靠性需求對應的門限K,如果沒達到,則可以映射,否則放棄映射到該服務器。
隨機產生動態到達的VDC拓撲和資源請求,並比較2EM算法、RAVDC算法和RA2EM算法隨著租戶VDC可靠性需求從0.05到0.80以間隔為0.05增長時的性能變化。
3.2 性能比較
3.2.1 VDC實際平均可靠性比較
3.2.2 VDC平均帶寬消耗比較
3.2.3 VDC平均能耗比較
在能耗方麵,隨著租戶VDC可靠性需求不斷增長,2EM算法所映射VDC的能耗較少,約為166W,原因是2EM算法盡可能集中放置VM;而RA2EM和RAVDC會隨著租戶VDC可靠性需求的增長不斷增大VM的分散程度,從而增加開啟的服務器數目,所以VDC的平均能耗不斷增加。RA2EM算法和RAVDC算法的VDC平均能耗相差不大,趨勢相似,原因是RA2EM算法和RAVDC算法都主要通過減少開啟的服務器數目來降低能耗。雖然RA2EM算法嚐試優化帶寬能耗,但是RA2EM算法和RAVDC算法在帶寬能耗上的差異不大,原因是在實際的數據中心中帶寬能耗極小,其在交換機總能耗中所占比例不會超過5%[10],所以帶寬能耗不會影響兩個算法的能耗性能。2EM算法是專門為減少能耗而提出的VDC映射算法,雖然RA2EM算法的能耗性能不如2EM,但是它並沒有改變2EM算法節能的核心思想,隻增加了VM放置數目的限製來滿足租戶VDC的可靠性需求,所以在可靠性感知的問題中,RA2EM算法仍然在節能方麵有著很高的效率。本文提出的RAVDC算法在能耗方麵能和RA2EM算法基本接近,表明RAVDC算法在能耗方麵也有很高的效率。