李 植 陳莉君
(西安郵電大學(xué)計(jì)算機(jī)學(xué)院 西安 710100)
云平臺(tái)作為第三方應(yīng)用的服務(wù)提供商,為應(yīng)用提供其運(yùn)行時(shí)所需的環(huán)境,因此引入了虛擬化技術(shù)。隨著虛擬化技術(shù)的迅速發(fā)展,容器作為一種操作系統(tǒng)層上的虛擬化技術(shù),成為了虛擬化領(lǐng)域的熱點(diǎn)[1~2]。
容器可被看作是一種“輕量級(jí)”的虛擬機(jī),憑借其輕量性和高效性,云平臺(tái)可利用容器為應(yīng)用快速的提供隔離的運(yùn)行環(huán)境以及資源。其中,Docker容器因其啟動(dòng)速度快,易于創(chuàng)建和銷毀等特點(diǎn)而被業(yè)界廣泛使用。隨著Docker容器在云平臺(tái)上的廣泛應(yīng)用,為了避免因?yàn)槿萜髻Y源分配不合理,造成容器服務(wù)質(zhì)量下降的現(xiàn)象,需要對(duì)容器資源進(jìn)行合理的控制。
關(guān)于容器資源的控制,Kubernetes,swarm等容器管理平臺(tái)都做了相關(guān)方面的研究。以Kuber?netes為例,Kubernetes中資源調(diào)度的單位為pod,它包含了一個(gè)或多個(gè)容器。針對(duì)pod,Kubernetes提出了多種資源調(diào)度算法,為其選取合適的運(yùn)行節(jié)點(diǎn)[3]。同樣,Swarm也是基于一種調(diào)度策略,來(lái)為容器提供相適應(yīng)的運(yùn)行節(jié)點(diǎn)[4]。而兩者對(duì)容器資源的控制實(shí)際是通過(guò)cgrous機(jī)制來(lái)完成。
現(xiàn)階段cgroups對(duì)容器資源的控制方法是,首先人工根據(jù)現(xiàn)有的容器資源使用數(shù)據(jù)預(yù)測(cè)應(yīng)用的資源需求,然后對(duì)容器資源進(jìn)行配額[5]。但該方法存在局限性,人工可分析的數(shù)據(jù)范圍有限,參考的因素有偏差,且存在主觀影響。所以預(yù)測(cè)結(jié)果存在偏差,可參考性不足,使得cgroups對(duì)容器資源的控制效果并不明顯。
針對(duì)上述缺點(diǎn),本文通過(guò)研究cgroups對(duì)Dock?er容器資源的控制方法,以及可控制的資源種類,提出了一種分類預(yù)測(cè)算法來(lái)提高cgroups控制容器資源的效率。
Docker是一款開(kāi)源的應(yīng)用容器引擎,該容器引擎是基于Linux container(LXC)技術(shù)的擴(kuò)展,它提供了用于管理容器的libcontainer庫(kù),如圖1所示[6]。其中,庫(kù)中的cgroups機(jī)制用于Docker對(duì)容器資源的控制。
圖1 libcontainer的組成
cgroups機(jī)制是用于控制一組進(jìn)程能夠使用資源多少的機(jī)制,其結(jié)構(gòu)如圖2所示。容器包含了一個(gè)或多個(gè)cgroups,相互關(guān)聯(lián)的cgroups以樹(shù)狀組織成層級(jí)結(jié)構(gòu)(hirearchy),不同的層級(jí)結(jié)構(gòu)掛載著不同的子系統(tǒng)(subsystem)。其中,子系統(tǒng)代表cgroups機(jī)制可控制的資源種類[7]。
圖2 cgroups機(jī)制結(jié)構(gòu)
當(dāng)前,使用cgroups對(duì)容器資源進(jìn)行控制的方式比較簡(jiǎn)單,人工參考容器在短時(shí)間內(nèi)的資源使用情況,預(yù)測(cè)其后期的使用情況,根據(jù)預(yù)計(jì)結(jié)果設(shè)置cgroups的資源控制文件,從而使得cgroups達(dá)到資源控制的目的。然而,人工可分析的數(shù)據(jù)范圍有限,參考的因素有偏差,且存在主觀影響。這些因素會(huì)對(duì)預(yù)測(cè)結(jié)果產(chǎn)生偏差,影響cgroups對(duì)容器資源的控制效果。
因此,需要有效且可靠的容器資源控制方法來(lái)支持cgroups對(duì)容器資源的控制,保證容器為應(yīng)用提供的服務(wù)質(zhì)量。
為了避免因?yàn)槿萜髻Y源分配不合理,造成容器服務(wù)質(zhì)量下降的現(xiàn)象,需要對(duì)容器進(jìn)行資源控制來(lái)保證容器的服務(wù)質(zhì)量。
假設(shè)當(dāng)前可為容器提供m種資源,并且每種資源的使用情況可被分為n種(比如:少量,一般,超量等),則容器對(duì)整體資源的使用情況可分為nm種。如果對(duì)nm種使用情況的整體數(shù)據(jù)集合進(jìn)行分析,則會(huì)因?yàn)槭褂们闆r之間的差異,造成預(yù)測(cè)結(jié)果存在偏差,不適用于整體容器。為了提高預(yù)測(cè)結(jié)果的精確度,分別對(duì)每種使用情況進(jìn)行分析,并將各種使用情況的分析結(jié)果作為預(yù)測(cè)憑據(jù),cgroups利用該預(yù)測(cè)憑據(jù)可提高對(duì)容器資源的控制效率。為此,提出了基于cgroups的分類預(yù)測(cè)算法。
該算法首先對(duì)所采集的數(shù)據(jù)集合進(jìn)行分類,數(shù)據(jù)集合中的數(shù)據(jù)來(lái)自任意時(shí)間點(diǎn)上容器資源的使用情況,是隨機(jī)且復(fù)雜的。因此,數(shù)據(jù)集合可被看作是一個(gè)不規(guī)則形狀的數(shù)據(jù)空間。為了得到數(shù)據(jù)空間最優(yōu)的分類結(jié)果,采用譜聚類算法進(jìn)行分類。譜聚類算法是一種基于圖論的算法,該算法能夠?qū)θ我庑螤畹臉颖究臻g進(jìn)行聚類且收斂于全局最優(yōu)解[8~9]。
對(duì)數(shù)據(jù)集合進(jìn)行分類后,對(duì)每種使用情況進(jìn)行詳細(xì)的分析,計(jì)算出nm種資源使用情況各自所對(duì)應(yīng)的類別權(quán)重。利用類別權(quán)重可預(yù)測(cè)容器在后期的資源使用情況,從而使用cgroups進(jìn)行資源控制。類別權(quán)重的求取,其實(shí)是一個(gè)子類與其他子類的劃分,是一個(gè)二分類過(guò)程。因此,采用泛化能力良好,且解為全局最優(yōu)解的支持向量機(jī)算法進(jìn)行計(jì)算[10]。
因此,基于該分類預(yù)測(cè)算法的容器資源控制框架如圖3所示。整體框架為該分類預(yù)測(cè)算法利用譜聚類對(duì)使用情況進(jìn)行分類,并利用支持向量機(jī)計(jì)算類別權(quán)重。依據(jù)類別權(quán)重預(yù)測(cè)容器后期的資源使用情況,使用cgroups對(duì)容器資源進(jìn)行控制。
在容器資源控制框架中,針對(duì)容器資源使用情況的隨機(jī)性和復(fù)雜性,提出了分類預(yù)測(cè)算法。該算法分為兩步,第一步是利用譜聚類對(duì)容器資源使用情況進(jìn)行分類,第二步是利用支持向量機(jī)計(jì)算每種類別的類別權(quán)重,計(jì)算過(guò)程如圖4所示。
圖3 容器資源控制框架圖
圖4 算法計(jì)算過(guò)程
圖4中,數(shù)據(jù)集合V由容器資源的使用情況組成,V中每個(gè)數(shù)據(jù)點(diǎn)vi代表任意時(shí)間點(diǎn)容器資源的使用情況,可表示為
其中,xi代表一種資源的使用情況,n表示容器可使用n種資源。
如果將每種資源看作一個(gè)維度,則該數(shù)據(jù)集合可被看作一個(gè)多維度數(shù)據(jù)空間。數(shù)據(jù)集合V中的數(shù)據(jù)點(diǎn)vi之間存在差異性,則該多維度數(shù)據(jù)空間的形狀是不規(guī)則。針對(duì)該不規(guī)則形狀的多維度數(shù)據(jù)空間,利用譜聚類算法和支持向量機(jī)算法來(lái)進(jìn)行分類與類別權(quán)重的計(jì)算。
譜聚類算法的主要思想是將數(shù)據(jù)點(diǎn)作為圖中的頂點(diǎn),且數(shù)據(jù)點(diǎn)之間用邊相連。相似度較低的兩點(diǎn),邊權(quán)重值較低;反之,邊權(quán)重值較高。數(shù)據(jù)集合因此成為了一個(gè)無(wú)向加權(quán)圖G=(V,E),V表示圖G中所有頂點(diǎn)的集合,E表示圖G中所有邊的集合[8~9]。數(shù)據(jù)集合V的分類實(shí)質(zhì)為圖G的分類。
譜聚類算法通過(guò)對(duì)圖G進(jìn)行切圖,使切圖后的子圖之間的邊權(quán)重和盡可能地小,子圖內(nèi)的邊權(quán)重和盡可能地大,從而達(dá)到聚類的目的。將圖G劃分為A,B兩個(gè)子圖的代價(jià)函數(shù)為
其中,A∪B=V,A∩B=?。
而容器資源的使用情況具有多樣性,因此采用譜聚類多路規(guī)范割集準(zhǔn)則,來(lái)獲得全局最優(yōu)的劃分結(jié)果,目的是將圖G同時(shí)劃分為k個(gè)子圖。目標(biāo)函數(shù)為
將上述目標(biāo)函數(shù)連續(xù)放松,將其轉(zhuǎn)換為對(duì)拉普拉斯矩陣L的譜分解問(wèn)題。拉普拉斯矩陣L是通過(guò)相似矩陣W和對(duì)角矩陣D進(jìn)行求?。?/p>
L=D-W
相似矩陣W由數(shù)據(jù)點(diǎn)之間的高斯距離求得,即:
其中,σ表示預(yù)先指定的參數(shù),目的是對(duì)數(shù)據(jù)點(diǎn)之間的距離進(jìn)行合適的放大或縮小。
對(duì)角矩陣 D=diag{d1,d2,…,dn}由相似矩陣W可得,其中di表示相似度矩陣W 第i行的行和,表示為
規(guī)范化拉普拉斯矩陣L,可得矩陣Lsym:
求取矩陣Lsym前m個(gè)最大特征值所對(duì)應(yīng)的特征 向 量 k1,k2,…,km,構(gòu) 造 特 征 向 量 矩 陣K=[k1,k2,…,km],將矩陣 K 的行向量轉(zhuǎn)變?yōu)閱挝幌蛄?,得到矩陣Y,即:
利用k-means算法對(duì)矩陣Y進(jìn)行聚類,可分得m類容器資源的使用情況類別,且該分類結(jié)果是全局最優(yōu)的。
利用譜聚類算法對(duì)數(shù)據(jù)集合劃分之后,獲得子類數(shù)據(jù)集合,可表示為
其中,Vi'為劃分后的子類樣本。
隨后,通過(guò)求取子類Vi'的類別權(quán)重,預(yù)測(cè)容器資源的使用情況。類別權(quán)重為每種資源的權(quán)重值所構(gòu)成的向量,表示為
其中,ωi表示第i個(gè)子類的類別權(quán)重,表示子類中第j種資源的權(quán)重。
類別權(quán)重的求取,實(shí)際為劃分單個(gè)子類與其他所有子類的過(guò)程,是二分類。為了在二分類的同時(shí)獲得類別權(quán)重,故采用支持向量機(jī)進(jìn)行計(jì)算。
支持向量機(jī)的主要思想是在數(shù)據(jù)集合中尋找一個(gè)超平面,使屬于不同類別的數(shù)據(jù)點(diǎn)正好位于超平面的兩側(cè),該超平面既能保證分類的精度,也能讓子類之間的間隔最大[10],如圖5所示。
圖5 支持向量機(jī)原理示意
支持向量機(jī)的目的是,根據(jù)有限樣本信息在模型中的學(xué)習(xí),保證后期對(duì)未知樣本數(shù)據(jù)具有良好的泛化能力,既能求取全局最優(yōu)解,又能保證目標(biāo)檢測(cè)分類器具有可靠的分類結(jié)果。另外,支持向量機(jī)避免了推演、歸納等復(fù)雜的計(jì)算過(guò)程,使得計(jì)算快速簡(jiǎn)便。
尋找最優(yōu)超平面的問(wèn)題是一個(gè)復(fù)雜的過(guò)程,所以支持向量機(jī)利用拉格朗日優(yōu)化方法將其轉(zhuǎn)化為二叉規(guī)劃問(wèn)題。在數(shù)據(jù)集合V中,假設(shè)超平面為
其中,x表示數(shù)據(jù)集合V中的數(shù)據(jù)點(diǎn),ωT表示權(quán)重,b表示影響因子。
根據(jù)平面幾何知識(shí),數(shù)據(jù)集合中任一點(diǎn)x與超平面上的投影點(diǎn)x0之間的關(guān)系為
由上述兩公式,可得兩點(diǎn)之間的距離為
為了使分類效果更明顯,距離γ需要增大,則||ω||需要減小。所以,可得目標(biāo)函數(shù)為
其中,yi為xi的類別標(biāo)簽。對(duì)上式引入拉格朗日乘子α并定義拉格朗日函數(shù)L:
使得問(wèn)題變?yōu)槎嬉?guī)劃問(wèn)題,最終求得目標(biāo)函數(shù)為
隨后,利用迭代求解的方法,從αi中任意提取兩個(gè)乘子,并固定其他乘子進(jìn)行計(jì)算,最終達(dá)到求解原問(wèn)題的目標(biāo)。同時(shí),獲得ω與b的結(jié)果,即類別權(quán)重與影響因子。
綜上,便是分類預(yù)測(cè)算法的整體計(jì)算過(guò)程。
通過(guò)在單核虛擬機(jī)中采集容器資源使用情況,使用分類預(yù)測(cè)算法進(jìn)行訓(xùn)練,求取類別權(quán)重。隨后采集測(cè)試集數(shù)據(jù),驗(yàn)證該算法的可用性。
實(shí)驗(yàn)在單核虛擬機(jī)中進(jìn)行,操作系統(tǒng)為cen?tos,容器為Docker。運(yùn)行2個(gè)容器應(yīng)用,以及1個(gè)容器壓力測(cè)試工具,并采集3種容器在運(yùn)行過(guò)程CPU和內(nèi)存的使用情況數(shù)據(jù)。如圖6、圖7所示。
圖6 CPU資源使用率
圖7 內(nèi)存資源使用率
圖6中,容器1對(duì)CPU資源使用率較高,基本處于40%~70%之間;容器2對(duì)CPU資源的使用率較低,基本處于10%~30%之間;容器3對(duì)CPU資源使用率一般,基本處于20%~40%。
圖7中,容器1對(duì)內(nèi)存資源的使用率基本處于10~40(MB)之間;容器2對(duì)內(nèi)存資源的使用率基本處于30~40(MB)之間;容器3對(duì)內(nèi)存資源的使用率基本處于20~30(MB)。
由兩幅圖,可看出當(dāng)容器1處于波峰時(shí),會(huì)導(dǎo)致其他容器處于波谷。所以,通過(guò)控制容器的CPU資源使用率和內(nèi)存資源使用率,使其靠近使用頻率最頻繁的情況下,限制類似于波峰的資源使用情況,空閑出資源為其它容器所使用。
通過(guò)譜聚類算法對(duì)數(shù)據(jù)集合進(jìn)行分類,實(shí)驗(yàn)規(guī)定了2種資源,以及每種資源的使用情況分為2類,則對(duì)該數(shù)據(jù)集合進(jìn)行4分類,結(jié)果如圖8所示。
圖8 譜聚類分類結(jié)果
利用支持向量機(jī)計(jì)算每種類別類別權(quán)重,結(jié)果如表1所示。
表1 類別權(quán)重表
表1中,W1、W2表示兩種資源,b表示影響因子。由表1可看出類別權(quán)重分為了4種情況,分別對(duì)應(yīng)4種類別。最后,利用測(cè)試集驗(yàn)證該分類預(yù)測(cè)算法,結(jié)果如表2所示,精度可到96%,適用性良好。
表2 實(shí)驗(yàn)結(jié)果數(shù)據(jù)表
本文針對(duì)容器資源控制,提出了分類預(yù)測(cè)算法,對(duì)容器資源的使用情況進(jìn)行分類,獲取每種類別的類別權(quán)重,從而用于對(duì)容器資源使用情況的預(yù)測(cè)。依據(jù)類別權(quán)重可提高cgroups的控制效果。實(shí)驗(yàn)結(jié)果表明,該分類預(yù)測(cè)算法的可用性較高。但該實(shí)驗(yàn)中,采集的資源種類較少,運(yùn)行環(huán)境較為單一,因此后期需對(duì)實(shí)驗(yàn)環(huán)境,以及數(shù)據(jù)的采集進(jìn)行擴(kuò)展。同時(shí),需對(duì)算法進(jìn)行優(yōu)化,使其滿足各種場(chǎng)景需求。