杭州電子科技大學(xué)電子信息學(xué)院 韓高帥 程知群 章 超
基于云計(jì)算平臺(tái)的虛擬機(jī)內(nèi)存管理系統(tǒng)
杭州電子科技大學(xué)電子信息學(xué)院 韓高帥 程知群 章 超
在云計(jì)算虛擬化平臺(tái)中,虛擬機(jī)在運(yùn)行不同的業(yè)務(wù)應(yīng)用時(shí),對(duì)內(nèi)存通常會(huì)有不同的需求。這種情況下,如果采用靜態(tài)的內(nèi)存分配方式,往往會(huì)造成內(nèi)存資源無法得到合理分配和使用。目前傳統(tǒng)的內(nèi)存管理系統(tǒng)只能將內(nèi)存性能提高10%左右。本文基于KVM虛擬化方案設(shè)計(jì)了由內(nèi)存動(dòng)態(tài)調(diào)整,內(nèi)存熱添加,內(nèi)存預(yù)留等幾個(gè)模塊組成的虛擬機(jī)內(nèi)存管理系統(tǒng)。從實(shí)驗(yàn)結(jié)果可知在使用本內(nèi)存管理系統(tǒng)的情況下,能夠有效的將系統(tǒng)的整體內(nèi)存性能提高25-30%。
云計(jì)算;虛擬機(jī);內(nèi)存管理;KVM
虛擬化技術(shù)能夠?qū)⒏鞣N計(jì)算機(jī)資源進(jìn)行抽象化并進(jìn)行統(tǒng)一表示,是實(shí)現(xiàn)云計(jì)算平臺(tái)的技術(shù)基礎(chǔ)。可以有效提高計(jì)算機(jī)資源的使用效率[1]。而內(nèi)存虛擬化管理在整個(gè)虛擬化系統(tǒng)中是實(shí)現(xiàn)最復(fù)雜的部分,并且也是提高虛擬機(jī)運(yùn)行效率的關(guān)鍵所在[2]。目前國(guó)內(nèi)外的內(nèi)存虛擬化管理系統(tǒng)通常需要對(duì)虛擬機(jī)客戶機(jī)系統(tǒng)做較大的修改,例如基于Xen虛擬化方案的內(nèi)存管理系統(tǒng)[3]。而常見的VMware虛擬機(jī)內(nèi)存管理系統(tǒng)方案無法保證虛擬機(jī)的最小物理內(nèi)存持有量[4]。目前,國(guó)內(nèi)外的虛擬機(jī)內(nèi)存管理系統(tǒng)通常能實(shí)現(xiàn)內(nèi)存超配110%左右。本文系統(tǒng)使用Linux自帶的KVM虛擬化方案,無需修改虛擬機(jī)系統(tǒng)[5]。另外,本系統(tǒng)的虛擬機(jī)內(nèi)存預(yù)留技術(shù),能夠保證虛擬機(jī)最小物理內(nèi)存持有量從而提升虛擬機(jī)運(yùn)行性能。內(nèi)存熱添加技術(shù)能夠在線增加虛機(jī)的內(nèi)存從而打破虛機(jī)內(nèi)存上限。動(dòng)態(tài)內(nèi)存管理技術(shù)能夠依據(jù)虛擬機(jī)運(yùn)行時(shí)內(nèi)存需求的變化來實(shí)時(shí)改變虛擬機(jī)的內(nèi)存大小。本內(nèi)存管理系統(tǒng)通過結(jié)合使用上述的內(nèi)存動(dòng)態(tài)調(diào)整,內(nèi)存預(yù)留和內(nèi)存熱添加技術(shù)能夠?qū)崿F(xiàn)系統(tǒng)內(nèi)存超配近130%。
圖1 系統(tǒng)總體結(jié)構(gòu)圖
圖2 系統(tǒng)模塊圖
本設(shè)計(jì)中,虛擬機(jī)采用KVM虛擬化方案,并使用libvirt作為虛擬機(jī)管理工具,提供虛擬化平臺(tái)管理應(yīng)用程序接口和virsh命令行管理工具。本設(shè)計(jì)方案主要使用C語(yǔ)言,shell和python對(duì)KVM,qemu,libvirt進(jìn)行開發(fā)和優(yōu)化實(shí)現(xiàn)。虛擬機(jī)的相關(guān)信息使用XML格式的文件保存。本系統(tǒng)的總體結(jié)構(gòu)如圖1所示。每個(gè)虛擬機(jī)以一個(gè)運(yùn)行在Host主機(jī)上的進(jìn)程的方式存在,虛擬機(jī)的相關(guān)配置在虛擬機(jī)進(jìn)程啟動(dòng)時(shí)從對(duì)應(yīng)的虛擬機(jī)XML配置文件的讀取。當(dāng)虛擬機(jī)需要進(jìn)行內(nèi)存訪問時(shí)虛擬機(jī)進(jìn)程切換到內(nèi)核態(tài),使用KVM內(nèi)核模塊進(jìn)行內(nèi)存模擬,并將結(jié)果返回虛擬機(jī)。如果是進(jìn)行IO等訪問則在用戶態(tài)使用Qemu進(jìn)行模擬,返回結(jié)果[6]。內(nèi)存管理系統(tǒng)為一個(gè)運(yùn)行在Host主機(jī)上的守護(hù)進(jìn)程,該守護(hù)進(jìn)程通過UNIX域套接字與相應(yīng)虛擬機(jī)進(jìn)行交互與通信。通過Libvirt管理工具管理虛擬機(jī)的資源分配及控制虛擬機(jī)的各種動(dòng)作。在虛擬機(jī)中也有內(nèi)存管理的相關(guān)驅(qū)動(dòng),負(fù)責(zé)虛擬機(jī)內(nèi)存信息的收集和上報(bào)給Host主機(jī),并接收主機(jī)的相關(guān)內(nèi)存調(diào)整指令對(duì)虛擬機(jī)內(nèi)存進(jìn)行調(diào)整。如圖2所示本系統(tǒng)主要有三部分組成:內(nèi)存動(dòng)態(tài)調(diào)節(jié)模塊,內(nèi)存熱添加模塊以及內(nèi)存預(yù)留模塊。
針對(duì)傳統(tǒng)內(nèi)存虛擬化管理系統(tǒng)無法高效分配虛擬機(jī)內(nèi)存的缺陷,本文通過設(shè)管理驅(qū)動(dòng)實(shí)時(shí)收集各虛機(jī)內(nèi)存使用情況,來實(shí)時(shí)調(diào)節(jié)虛機(jī)內(nèi)存大小。內(nèi)存熱添加模塊,能夠在虛擬機(jī)不關(guān)機(jī)狀態(tài)下在線增加虛擬機(jī)的內(nèi)存,它彌補(bǔ)傳統(tǒng)虛擬機(jī)管理系統(tǒng)中無法在線改變虛擬機(jī)的內(nèi)存上限的缺陷。用戶可以根據(jù)自己的需要,手動(dòng)的增加虛擬機(jī)的內(nèi)存上限。內(nèi)存預(yù)留和保護(hù)模塊,這個(gè)模塊能夠保證虛擬機(jī)至少保持一定量物理內(nèi)存不被Host主機(jī)回收。彌補(bǔ)傳統(tǒng)內(nèi)存虛擬機(jī)管理方案無法保證虛擬機(jī)最小物理內(nèi)存持有量的導(dǎo)致虛擬機(jī)性能下降嚴(yán)重的缺陷[7]。
2.1 內(nèi)存動(dòng)態(tài)自動(dòng)調(diào)節(jié)模塊
運(yùn)行在Host主機(jī)上的內(nèi)存管理的守護(hù)進(jìn)程通過每個(gè)虛擬機(jī)的UNIX域套接字定期的收集虛擬機(jī)的內(nèi)存信息。收集的信息如表1所示。
表1 虛擬機(jī)內(nèi)存信息
Host主機(jī)每隔10秒統(tǒng)計(jì)虛擬機(jī)的內(nèi)存利用率Mem_ used=(Mem_guest_use+ Mem_guest_loss)/ Mem_guest_total。如果虛擬機(jī)內(nèi)存利用率連續(xù)三次大于80%或者連續(xù)三次小于60%,那么將對(duì)虛擬機(jī)內(nèi)存進(jìn)行調(diào)整。使用Memutl[3]數(shù)組,分別記錄最新三次的內(nèi)存利用率。并預(yù)測(cè)未來虛擬機(jī)的內(nèi)存利用率Memnutl=Memutl[0]*0.2+Memutl[1] *0.3+Memutl[2]*0.5,其中Memutl[2]表示三次統(tǒng)計(jì)中最新的那一次。當(dāng)內(nèi)存利用率連續(xù)三次超過80%時(shí),Host主機(jī)釋放部分從虛擬機(jī)回收的內(nèi)存。釋放內(nèi)存大小的公式為:Mem_d=(Memnutl-0.8)/0.2*Mem_guest_loss。如果當(dāng)內(nèi)存利用率連續(xù)三次低于60%時(shí),回收部分虛機(jī)的內(nèi)存。回收內(nèi)存大小的公式為:Mem_x=Mem_guest_total*(0.7-Memnutl),Mem_ d=MIN(Mem_x,0.8* Mem_guest_free)。但是為了保證虛擬機(jī)的運(yùn)行效率,最多只能釋放Mem_guest_free的80%。由于虛擬機(jī)內(nèi)存動(dòng)態(tài)調(diào)節(jié)會(huì)造成Host主機(jī)較大的開銷,只有當(dāng)Mem_d> Mem_guest_ total*0.03時(shí)啟動(dòng)虛擬機(jī)內(nèi)存調(diào)節(jié)動(dòng)作。主機(jī)通過調(diào)用經(jīng)過修改后的libvirt的virDomainSetMemoryFlags接口,控制虛擬機(jī)內(nèi)的內(nèi)存管理驅(qū)動(dòng),調(diào)整虛擬機(jī)內(nèi)存。
2.2 內(nèi)存熱添加模塊
為了實(shí)現(xiàn)內(nèi)存熱添加功能,首先需要在虛擬機(jī)的XML文件中添加slots和maxmem參數(shù)。其中maxmem表示虛擬機(jī)能擁有的最大內(nèi)存值,考慮到目前各操作系統(tǒng)所能支持的最大內(nèi)存,該值設(shè)為1TB。Slots表示內(nèi)存插槽數(shù),即每個(gè)虛擬機(jī)可內(nèi)存熱添加的次數(shù)??紤]到內(nèi)存熱添加次數(shù)過多會(huì)影響主機(jī)和虛擬機(jī)效率,目前該值設(shè)置為10.對(duì)libvirt端的qemuDomainSetMemoryFlags函數(shù)進(jìn)行修改,增加內(nèi)存熱添加的相關(guān)Flags標(biāo)簽,執(zhí)行熱添加的相關(guān)動(dòng)作。當(dāng)KVM虛擬機(jī)觸發(fā)內(nèi)存熱添加操作時(shí),內(nèi)存管理系統(tǒng)調(diào)用修改過的qemuDomainSetMemoryFlags函數(shù)主要完成兩個(gè)動(dòng)作。先調(diào)用object_add接口,為相應(yīng)的虛擬機(jī)申請(qǐng)指定大小的內(nèi)存,并完成相關(guān)的內(nèi)存初始化操作。然后調(diào)用device_add接口將所申請(qǐng)的內(nèi)存設(shè)備添加到對(duì)應(yīng)的虛擬機(jī)中。更新虛擬機(jī)相關(guān)頁(yè)表,然后把該部分內(nèi)存置成online狀態(tài)。并將虛擬機(jī)的Mem_guest_total更新為內(nèi)存熱添加之后的值。
2.3 內(nèi)存預(yù)留和保護(hù)模塊
虛擬機(jī)的內(nèi)存大小,即為Host主機(jī)給對(duì)應(yīng)的虛擬機(jī)進(jìn)程所分配的內(nèi)存大小。根據(jù)Linux系統(tǒng)自身的內(nèi)存管理機(jī)制,如果當(dāng)進(jìn)程的某部分內(nèi)存長(zhǎng)期不使用時(shí),該部分物理內(nèi)存會(huì)被轉(zhuǎn)換到Swap區(qū),被系統(tǒng)回收。這種情況下,虛機(jī)運(yùn)行性能可能會(huì)大大下降。本模塊的主要作用就是避免上述情況的發(fā)生。首先在虛擬機(jī)的XML文件中添加一個(gè)mlock參數(shù)。該值必須在0-100之間。由用戶自行根據(jù)設(shè)定。Mem_mlock=Mem_guest_total *Mem_mlock/100表示虛擬機(jī)內(nèi)存中被鎖定為最低物理內(nèi)存的值。Mem_mlock這部分值,無論在何種情況下既不會(huì)被轉(zhuǎn)換到swap區(qū),也不會(huì)被內(nèi)存動(dòng)態(tài)自動(dòng)調(diào)節(jié)模塊所回收,從而保證虛擬機(jī)的運(yùn)行效率。
本次測(cè)試使用的服務(wù)器的CPU型號(hào)為Intel(R)Xeon(R)E5-2620 v2@2.10GHz,內(nèi)存為48GB,存儲(chǔ)大小為270GB。Host主機(jī)使用的操作系統(tǒng)為Ubuntn 12.04(內(nèi)核)3.13.6.客戶機(jī)操作系統(tǒng)分別為較為常見的windows7和redhat6.5的64位系統(tǒng)。
內(nèi)存超配測(cè)試:
測(cè)試主機(jī)內(nèi)存在按不同百分比超配分配給虛擬機(jī)時(shí),同一虛擬機(jī)在運(yùn)行同一應(yīng)用時(shí),虛擬機(jī)是否被合理分配給了所需內(nèi)存和應(yīng)用運(yùn)行完成所需的時(shí)間。如圖3所示結(jié)果表明在未使用本內(nèi)存管理系統(tǒng)的情況下,在主機(jī)使用率在100%時(shí),虛擬機(jī)的應(yīng)用在運(yùn)行時(shí)無法被分配到足夠的內(nèi)存,虛擬機(jī)運(yùn)行應(yīng)用完成的時(shí)間也大大增加。這是因?yàn)樵谖词褂帽緝?nèi)存管理系統(tǒng)時(shí),由于主機(jī)的虛擬化系統(tǒng)運(yùn)行時(shí)也需要內(nèi)存,在將全部?jī)?nèi)存分配給虛擬機(jī)時(shí),勢(shì)必導(dǎo)致主機(jī)虛擬化系統(tǒng)無法獲得足夠內(nèi)存,導(dǎo)致虛擬機(jī)運(yùn)行性能下降。如圖4所示,在使用本內(nèi)存管理系統(tǒng)情況下,主機(jī)可分配130%的內(nèi)存給虛擬機(jī)。通過本內(nèi)存管理系統(tǒng)的高效分配內(nèi)存,虛擬機(jī)應(yīng)用依舊能夠基本獲得所需內(nèi)存。虛擬機(jī)應(yīng)用運(yùn)行所增加的時(shí)間也在可接受范圍內(nèi)。由此可見,本內(nèi)存管理系統(tǒng)能夠通過高效分配主機(jī)內(nèi)存,實(shí)現(xiàn)主機(jī)內(nèi)存的超配使用,具有顯著的應(yīng)用價(jià)值。
圖3 未使用本內(nèi)存管系統(tǒng)內(nèi)存測(cè)試結(jié)果
圖4 使用本內(nèi)存管系統(tǒng)內(nèi)存測(cè)試結(jié)果
本文所提出的內(nèi)存管理系統(tǒng),主要由內(nèi)存動(dòng)態(tài)自動(dòng)調(diào)節(jié)功能,內(nèi)存熱添加功能和內(nèi)存預(yù)留功能三部分組成。能夠在一定程度上實(shí)現(xiàn)Host主機(jī)內(nèi)存的過量使用。并可以通過內(nèi)存熱添加功能打破虛機(jī)的內(nèi)存上限。而內(nèi)存預(yù)留功能又能夠根據(jù)客戶不同的需求保證虛擬機(jī)的不同內(nèi)存使用量。本系統(tǒng)設(shè)計(jì)了一種較為完善,高效的內(nèi)存管理方案,有較好的實(shí)際應(yīng)用價(jià)值。
[1]張偉哲,張宏莉。云計(jì)算平臺(tái)中多虛擬機(jī)內(nèi)存協(xié)同化策略研究[J]。計(jì)算機(jī)學(xué)報(bào),2011(12):2265-2677.
[2]許磊。基于云計(jì)算環(huán)境的虛擬機(jī)內(nèi)存管理研究[D]。哈爾濱:哈爾濱工程大學(xué),2013:7-17.
[3]Guilin Zhang,Huiqiang Wang,Hongwulv,et al。A dynamic memory management model on xen virtual machine[C]。2013 International Conference on MEC,2013:1609-1613.
[4]Haikun Liu,Hai Jin,Xiaofei Liao,et al。Hotplug or Ballooning:A comparative study on dynamic memory management techniques for virtual machines[J]。IEEE Transactions on parallel and distributed systems,vol。26,No。5,May 2015:1350-1362.
[5]Ramide Dantas,Djamel Sadok,Christofer Flinta,KVM Virtualization Impact on Active Round-Trip Time Measurements[J]。2015 IFIP/IEEE International Symposium on Integrated Network Management,2015:810-813.
[6]Russell R。virtio:towards a de-facto standard for virtual I/O devices[J]。ACM SIGOPS Operating Systems Review,2008,42(5):95-103.
[7]馬博。基于內(nèi)存熱插拔的虛擬機(jī)動(dòng)態(tài)內(nèi)存管理系統(tǒng)[D]。武漢:華中科技大學(xué),2012:8-14.