柳春懿,張 曉,覃源淞,蘆尚奇
(西北工業大學計算機學院,西安710029)(*通信作者電子郵箱18729580703@163.com)
隨著云計算技術的發展,云計算依靠自身優秀的性能、靈活的擴展性、低廉的價格吸引著國內外企業將自身的業務遷移到云上。在各方共同努力下,云生態圈越來越完善,企業轉型到云上也成為了不可逆轉的潮流。然而根據Reiss等[1]于2012年提出的研究成果可知,谷歌數據中心的資源利用率竟然低于50%。作為全球優秀的云計算提供商,不缺乏優秀的調度算法,依然沒有很好地解決利用率低下的問題。主要原因是隨著云上企業數量上的增長,企業的任務種類也在不斷增加。復雜的任務種類和性能特征導致用戶資源的申請選擇困難,如果申請的虛擬機硬件性能太高會造成資源的浪費;反之性能太低會造成不能滿足企業的基本需求,降低任務的服務質量。若資源利用率較低的情況下,會導致運營成本增加,浪費現有資源。但是現階段大部分企業在沒有很好的指導情況下,為了保證服務質量,都會過多地申請資源[2]。
現有的指導手段主要是通過用戶手動填入應用相應信息。例如阿里云服務,會讓填寫需求類型、心理價位、需求描述、行業領域等,這對一般的用戶,尤其是非專業用戶而言,無疑是個困難的操作。另外,有些企業會找專業人士來分析任務需求,一般專業人士的專家費是一筆不小的開銷。這樣簡單的描述并不能準確地描述任務類型和任務需求,分配的資源也達不到按需分配目的,所以亟需一種獲取應用性能信息的分析方法:一方面為用戶提供一套準確的按需分配解決方案,另一方面將信息給云提供商以更準確地分配硬件資源,達到節省資源的目標。
與傳統的任務遷移相比,企業任務遷移存在以下問題:
1)大部分的企業的任務運行在物理機上,如何準確全面采集任務在物理機上的有用信息。
2)不同機器配置所表現出來的性能特征會有所差異,例如Intel i7和Intel i3處理器的CPU在同等利用率情況下,處理能力差距巨大。除此之外,統一物理機上的虛擬機之間會互相影響,如何用最少的性能特征完整地描述任務。多維度的資源需求將會增加描述任務的難度。
3)根據所獲取的任務性能特征信息,如何細分該任務類型,以此為基礎分配相應的資源,一方面提供給用戶進行選擇,另一方面提供給云提供商進行全局資源調度。
已經有很多文獻提出了應用性能分類的方法:其中文獻[3]中對用戶的源碼進行分類,利用浮點運算關系分析程序的復雜度,鑒于云平臺下用戶安全性,源碼通常不可獲得;文獻[4]中根據網絡服務響應時間,通過基于分析模型的排隊理論分析;在此基礎之上,文獻[5]中提出了多類排序預測在線虛擬機工作負載響應時間和吞吐量。針對云環境下資源需求預測許多研究學者分別利用回歸模型[6]、時間序列分析[7]、基于狀態分析[8]、機器學習模型[9]、模式匹配[10]等方法研究上。這些方法都是基于預測機制,因為運行時間短,預測準確度難以保障。除此之外,文獻[11]中采用決策樹的軟件分類方法,但是只是針對CPU和內存進行粗粒度分類;文獻[12]中比較全面地提出許多任務類型,但是劃分方法過于簡單;文獻[13]中基于利用率特征分析,并沒有全面地進行描述任務特征。
針對以上問題,本文提出了任務性能的最小參數集合,從計算、網絡、硬盤三個大方面,全方位更細粒度地描述任務。并利用開發的低負載的性能采集工具采集該任務性能,將采集的性能映射到云上性能。根據采集的性能參數,利用奧姆剃須刀原理,即實際應用中,模型越簡單越高效[14]。使用權重可配的多KD(K-Dimension)樹 KNN(K-Nearest Neighbors)算法,詳細劃分任務類型。使用KD樹減少存儲量和計算量[15],使用交叉驗證方法提高準確度[16]。最后結合云上性能屬性和任務類型,給用戶提供虛擬機配置的詳細信息,給云提供商提供任務性能相關的詳細信息。
服務性能 QoS(Quality of Service)指標通常使用 SLA(Service Level Agreement)協議來描述,為了滿足SLA協議相關內容,單獨考慮某一個硬件的性能達標是不準確的。通過預測的方法得到的性能屬性只適應在同一云環境下進行[17],并且數據準確性不高。本文使用歷史數據判斷遷移所需配置和任務類型,既能準確根據實際使用情況給用戶提供虛擬機選擇方案,又能根據任務種類和表現出來的性能特征為云提供商分配方案作參考。具體如圖1所示。
本文根據云計算提供的服務將資源分為計算、存儲、網絡資源,并且有該三大資源引申出具體可測量的硬件特征,即計算表現硬件特征為CPU和內存;存儲表現為硬盤和讀寫I/O;網絡表現為網絡拓撲和網絡帶寬。這些硬件特征不能很好得到控制和測量,所以根據實際需求本文提出了任務數據特征,并且建立性能向量。根據所選的數據特征通過模型映射到云平臺上,提供虛擬機的配置信息。除此之外,將這些數據特征輸入到用基準測試數據的訓練集中,細粒度劃分任務類型。最終,給用戶提供資源申請建議同時給云提供商提供虛擬機分配調度建議。

圖1 邏輯框架Fig.1 Logical framework
想要全面準確地描述任務信息,最為直觀和重要的就是任務的性能數據特征,硬件的性能數據特征包含了描述任務的各種信息。
有很多性能特征可以來描述這個任務,如果參數選擇不準確,那么將不能準確描述任務;如果參數選擇過少,那么不能全面地描述任務;如果參數選擇過多,那么將增大采集工具的負載,使得數據不準確。所以在性能特征選擇上,本文認為應該注意以下幾點:1)所選的數據特征應該可以全方面地描述負載情況,并且必須是容易觀察和控制;2)所選的硬件參數必須可以通過云平臺動態配置;3)應該需要確立能夠捕捉任務性能的最小參數集合;4)考慮任務的服務質量是由CPU、內存等多維因素共同決定的,并不和某一個單維度的資源成特定的關系。
根據阿里云服務,資源分為基礎資源和額外附加資源。基礎資源分為實例信息、磁盤信息、網絡資源選擇。實例信息選擇包括CPU核數、內存大小、I/O是否優化。磁盤信息選擇包括系統盤和數據盤選擇、磁盤大小、磁盤類型(普通云盤、高效云盤、SSD云盤和本地SSD磁盤)。網絡資源選擇包括包月或按量類型、寬帶規格等。額外附加資源包括對象存儲、云數據庫、安全網絡等。本文僅針對基礎資源中的計算、磁盤、網絡分別進行數據特征提取和描述:
1)計算資源。CPU的運算能力不但CPU利用率有關,而且和CPU的類型、主頻、外頻、高速緩存等相關。本文直接利用CPU的服務質量表示所需要的速度,如FLOPS(Floating-Point Operations Per Second),或對潛在的CPU性能的利用。阿里云采用的是 Intel Xeon E5-2420 CPU,主頻1.9 GHz,啟用了超線程。本文在阿里云的虛擬機進行了測試,使用LINX工具針對操作系統為WindowsServer 2012版本不同核數CPU進行測試。計算規模為10 000,重復次數為5,得到了該平臺所給的 1核、2核、4核平均 GFLOPS分別為 21.503 6、41.5510、85.5912,并且方差分別為 0.426、0.201、0.107,由此可以驗證虛擬機的FLOPS隨著核數的增加穩定線性地增加。
2)存儲資源。根據中國信息化周報統計,阿里SSD云盤可以提供15 000的IOPS(Input/Output Operations Per Second),高效云盤IOPS為3000,而普通云磁盤讀的IOPS大約為800,寫的大約為400。
3)網絡資源。阿里云提供總網絡帶寬大小選擇。
本模型使用 (F,M,U,D,S,N)六維向量來描述任務的整體運行情況。其中:F表示CPU的浮點運行能力作為虛擬機和物理機的統一標準,M表示內存總量,U表示內存使用率,D表示磁盤大小,S表示磁盤的讀寫速度,N表示網絡帶寬。針對以上六維性能向量進行數據采集,若使用成熟工具Ganglia等,會存在如磁盤讀寫信息不能獲取等問題。大部分工具都是只對一方面數據參數進行采集,不滿足全面描述的需求,所以本文實現了Lbenchmark采集工具,將對所需計算、存儲、網絡資源統一采集。
對比分布式信息采集Ganglia,Lbenchmark減少了機群之間的通信,針對特定的應用程序,可以減少信息采集項的個數[18],降低信息采集頻率[19],進而降低整體監控的負載。
該工具通過UI(User Interface)和用戶交互,內部控制模塊提供對外接口。在不同的節點上部署采集工具,采集數據并分析處理。該分布式采集工具邏輯框架如圖2所示。

圖2 采集工具模塊Fig.2 Collection tool module
為了對比Ganglia監控系統和Lbenchmark系統產生負載對機器的影響,使用CPU占用時間作為測試的指標,利用top工具可以查看到進程所占用的CPU時間長度,分別在機器上做無監控系統、有Lbenchmark監控和有Ganglia監控的負載情況測試,得出的測試結果如圖3所示。
從圖3可以看出,Lbenchmark采集工具占用的CPU時間相對較短,可以低負載地運行采集工具,進而減少采集工具對任務的影響。

圖3 CPU占用時間比較Fig.3 Comparison of CPU occupancy time
傳統提高利用率的方法為調度,但是現在的云資源調度基本上都是對臨時的狀態信息作出調度策略。為了得到最優的有效調度策略,已知任務的類型和資源需求是必不可少的,本文針對已知任務使用特定的負載生成工具進行負載任務特征收集,在任務遷移之前,提供任務特征。
根據任務的性能不同,本文細分任務類型,將傳統的粗粒度劃分機制,即計算、存儲、網絡更詳細地劃分。首先根據負載的時間變化,分為密集型和隨機型。密集型指即在一定長時間內硬件都處在高負載狀態下;隨機型是指硬件的負載在一定長時間情況隨機,例如Web應用任務。針對硬件不同可將任務細分為以下類型:1)CPU密集型;2)硬盤密集型;3)內存密集型;4)計算密集型(CPU+內存);5)I/O密集型;6)全負載密集型。
本文將標準負載生成工具和Linux基礎命令作為訓練任務,在測試服務器上運行得到性能數據特征,利用KNN算法建立歷史數據的訓練集。所選用負載生成工具如表1所示。

表1 Benchmark用例Tab.1 Benchmark templates
本文針對數量巨大且分類清晰的訓練數據,采用基于屬性權重的KD 樹 KNN優化算法。K近鄰模型的特征空間一般是n維實數向量空間,使用的距離一般使用歐氏距離來表示:

KNN簡單算法存在問題有:1)計算量和存儲量巨大。2)K值選擇問題,K值的減小就意味著整體模型變得復雜,容易發生過擬合;K值的增大就意味著整體的模型變得簡單;K=N,則完全不足取,因為此時無論輸入實例是什么,都只是簡單的預測,它屬于在訓練實例中最多的類,模型過于簡單,忽略了訓練實例中大量有用信息。針對K的取值,數據挖掘領域通常使用交叉驗證方法來選擇最優的K值。3)專用性不強,對特定的分類任務沒有很好地優化。
在KNN簡單算法中,對于每一個待測樣本點,都要逐一地計算其與對整個樣本集中的每一個點的距離,計算并存儲好以后,再查找K近鄰。KD樹是一種分割K維數據空間的數據結構,有助于減少存儲空間和計算量。即對樣本集進行組織與整理,分群分層,盡可能將計算壓縮到在接近測試樣本鄰域的小范圍內,避免盲目地與訓練樣本集中每個樣本進行距離計算。
本文提出了一種基于屬性權重的KD樹 KNN,將屬性對距離的影響根據任務的類型分配權重,比如測試數據在和類型不同的訓練數據進行比較,距離公式則成為加權歐拉公式。1/sk為每一個屬性的權重。

因為云平臺的任務類型固定,所以本文采用按任務類型建立不同權重KNN分類器,并且采用交叉驗證尋找每個分類器權重大小,避免了KNN簡單算法中的K值選擇問題,選擇出最優K值,并根據分類器的數量N決定分類器K值大小。然后將每個分類器選出的數據輸入到距離排序器中,因為每個分類器所使用的距離公式統一,所以將排序器從小到大順序排列,選取前K個數據進行選舉,最終獲得未知任務的類型。偽代碼如下:
預處理數據,將類型不同的數據分開
調整每個類型中每個屬性參數r[N][M]
FOR 0→N:
建立KD樹
根據屬性參數調整值
歸一化處理
將訓練數據加入KD樹中
建成N個KD樹的分類器
For 0→L組測試數據:
For 0→N組分類器:
根據屬性參數調整測試數據
歸一化處理測試數據
找出前B個最近距離列表D[B]
合并N個D[B]列表
篩選出前K個距離最小的值
根據前K個值進行選舉,得到該測試數據的類型根據L組數據類型進行選舉,得到該任務類型
所有基于KNN的算法的分類器,都不需要訓練集進行訓練,所以訓練的時間復雜度是0,假設該訓練集數為n。
簡單KNN算法 KNN分類的計算復雜度和訓練集中的文檔數目成正比,也就是說簡單KNN的分類時間復雜度為O(n)。
KD樹 KNN算法 采用了 KD樹的時間復雜度為O(lb n)。
多KD樹 KNN算法 因為將n劃分為m類,所以該時間負載度應該為O(lb n/m)。
本文實驗采用的測試節點機器,硬件環境為4個雙核英特爾 CPU,主頻為1.8 GHz,16 GB 內存,160 GB 硬盤。
本文分別采用Lbenchmark和Ganglia的數據作為訓練數據,并且分別使用該訓練數據的80%作為測試數據,對簡單KNN算法、KD 樹 KNN算法、加權衡的多KD樹 KNN算法進行比較,結果如圖4~5所示。
從圖4可以看出,多KD樹的權值可配置的KNN算法準確度明顯高于KD 樹 KNN算法。從圖5可以看出,簡單KNN的時間負載極高,單線程下KD 樹 KNN算法和多KD樹KNN算法的時間復雜度相近。多KD樹可以采用多線程機制加速,進一步減少運行時間。

圖4 不同算法的準確度比較Fig.4 Accuracy comparison of different algorithms

圖5 不同算法的運行時間比較Fig.5 Running time comparison of different algorithms
通過對比大部分云平臺上的輸入參數,用戶主要的選擇參數向量如下:

其中:CV表示CPU類型;CNV表示核數;MV表示內存類型;MNV表示內存大小;DV表示磁盤類型;DNV表示磁盤大小;NV表示網絡帶寬;IOV表示是否進行網絡優化。
根據獲取的(F,M,U,D,S,N)六維采集向量和任務類型綜合考慮,給出用戶選擇參數向量,所以本文提供了不同服務器到虛擬機的映射方法,如下所示。
#有關CPU的信息
查詢或計算該云計算平臺不同CPU數組L[n],計算能力升序數組 F[n]
WHLIE TRUE:
查找出云平臺上CPU核數np* 計算能力F[i]略小于F的值。退
出循環
Cv=L[i]
CNv=np
#有關內存
MNv=M*U
#有關網絡
Nv=N
#有關磁盤
DNv=D
FOR PS in磁盤類型列表:
查找出PS的IOPS略小于S的值。退出循環
Dv=PS
#有關任務
IF類型為CPU密集型負載:
CPU類型升級Cv=L[i+1]
ELIF類型為內存密集型負載:
內存類型升級Mv=K[1]
ELIF類型為計算密集型負載:
內存類型升級Mv=K[1]
CPU類型升級Cv=L[i+1]
ELIF類型為網絡密集型負載:
IOv=TRUE
ELIF類型為磁盤密集型負載:
磁盤類型升級Dv=PS+1
ELIF類型為全負載密集型負載:
磁盤類型升級Dv=PS+1
IOv=TRUE
內存類型升級Mv=K[1]
CPU類型升級Cv=L[i+1]
本文給出能體現任務的數據特征向量,并根據其硬件特征對任務進行細粒度劃分。使用輕量級的采集工具Lbenchmark采集所需要硬件數據特征,采用簡單的多KD樹KNN算法,對未知任務類型進行準確分類。與現有的KNN算法相比,本文提出可以主動調整參數的方法來提高預測類型的準確性。實驗結果表示Lbenchmark可以比較全方面地以較低的負載波動獲取到任務的數據特征。使用該特征和屬性可調的多KD樹KNN算法進行分類,準確度得到了有效提高,計算量和存儲量相對減少。之后,利用數據特征映射將資源建議提供給用戶和云提供商,進而提高云平臺整體的利用率。
在今后的研究中,將在該文的基礎之上對云平臺內部調度進行更加深入的研究。將任務信息和任務類型與不同的調度算法結合,以達到全局能耗最低。