杭州電子科技大學電子信息學院 韓高帥 程知群 章 超
基于云計算平臺的虛擬機內存管理系統
杭州電子科技大學電子信息學院 韓高帥 程知群 章 超
在云計算虛擬化平臺中,虛擬機在運行不同的業務應用時,對內存通常會有不同的需求。這種情況下,如果采用靜態的內存分配方式,往往會造成內存資源無法得到合理分配和使用。目前傳統的內存管理系統只能將內存性能提高10%左右。本文基于KVM虛擬化方案設計了由內存動態調整,內存熱添加,內存預留等幾個模塊組成的虛擬機內存管理系統。從實驗結果可知在使用本內存管理系統的情況下,能夠有效的將系統的整體內存性能提高25-30%。
云計算;虛擬機;內存管理;KVM
虛擬化技術能夠將各種計算機資源進行抽象化并進行統一表示,是實現云計算平臺的技術基礎。可以有效提高計算機資源的使用效率[1]。而內存虛擬化管理在整個虛擬化系統中是實現最復雜的部分,并且也是提高虛擬機運行效率的關鍵所在[2]。目前國內外的內存虛擬化管理系統通常需要對虛擬機客戶機系統做較大的修改,例如基于Xen虛擬化方案的內存管理系統[3]。而常見的VMware虛擬機內存管理系統方案無法保證虛擬機的最小物理內存持有量[4]。目前,國內外的虛擬機內存管理系統通常能實現內存超配110%左右。本文系統使用Linux自帶的KVM虛擬化方案,無需修改虛擬機系統[5]。另外,本系統的虛擬機內存預留技術,能夠保證虛擬機最小物理內存持有量從而提升虛擬機運行性能。內存熱添加技術能夠在線增加虛機的內存從而打破虛機內存上限。動態內存管理技術能夠依據虛擬機運行時內存需求的變化來實時改變虛擬機的內存大小。本內存管理系統通過結合使用上述的內存動態調整,內存預留和內存熱添加技術能夠實現系統內存超配近130%。

圖1 系統總體結構圖

圖2 系統模塊圖
本設計中,虛擬機采用KVM虛擬化方案,并使用libvirt作為虛擬機管理工具,提供虛擬化平臺管理應用程序接口和virsh命令行管理工具。本設計方案主要使用C語言,shell和python對KVM,qemu,libvirt進行開發和優化實現。虛擬機的相關信息使用XML格式的文件保存。本系統的總體結構如圖1所示。每個虛擬機以一個運行在Host主機上的進程的方式存在,虛擬機的相關配置在虛擬機進程啟動時從對應的虛擬機XML配置文件的讀取。當虛擬機需要進行內存訪問時虛擬機進程切換到內核態,使用KVM內核模塊進行內存模擬,并將結果返回虛擬機。如果是進行IO等訪問則在用戶態使用Qemu進行模擬,返回結果[6]。內存管理系統為一個運行在Host主機上的守護進程,該守護進程通過UNIX域套接字與相應虛擬機進行交互與通信。通過Libvirt管理工具管理虛擬機的資源分配及控制虛擬機的各種動作。在虛擬機中也有內存管理的相關驅動,負責虛擬機內存信息的收集和上報給Host主機,并接收主機的相關內存調整指令對虛擬機內存進行調整。如圖2所示本系統主要有三部分組成:內存動態調節模塊,內存熱添加模塊以及內存預留模塊。
針對傳統內存虛擬化管理系統無法高效分配虛擬機內存的缺陷,本文通過設管理驅動實時收集各虛機內存使用情況,來實時調節虛機內存大小。內存熱添加模塊,能夠在虛擬機不關機狀態下在線增加虛擬機的內存,它彌補傳統虛擬機管理系統中無法在線改變虛擬機的內存上限的缺陷。用戶可以根據自己的需要,手動的增加虛擬機的內存上限。內存預留和保護模塊,這個模塊能夠保證虛擬機至少保持一定量物理內存不被Host主機回收。彌補傳統內存虛擬機管理方案無法保證虛擬機最小物理內存持有量的導致虛擬機性能下降嚴重的缺陷[7]。
2.1 內存動態自動調節模塊
運行在Host主機上的內存管理的守護進程通過每個虛擬機的UNIX域套接字定期的收集虛擬機的內存信息。收集的信息如表1所示。

表1 虛擬機內存信息
Host主機每隔10秒統計虛擬機的內存利用率Mem_ used=(Mem_guest_use+ Mem_guest_loss)/ Mem_guest_total。如果虛擬機內存利用率連續三次大于80%或者連續三次小于60%,那么將對虛擬機內存進行調整。使用Memutl[3]數組,分別記錄最新三次的內存利用率。并預測未來虛擬機的內存利用率Memnutl=Memutl[0]*0.2+Memutl[1] *0.3+Memutl[2]*0.5,其中Memutl[2]表示三次統計中最新的那一次。當內存利用率連續三次超過80%時,Host主機釋放部分從虛擬機回收的內存。釋放內存大小的公式為:Mem_d=(Memnutl-0.8)/0.2*Mem_guest_loss。如果當內存利用率連續三次低于60%時,回收部分虛機的內存。回收內存大小的公式為:Mem_x=Mem_guest_total*(0.7-Memnutl),Mem_ d=MIN(Mem_x,0.8* Mem_guest_free)。但是為了保證虛擬機的運行效率,最多只能釋放Mem_guest_free的80%。由于虛擬機內存動態調節會造成Host主機較大的開銷,只有當Mem_d> Mem_guest_ total*0.03時啟動虛擬機內存調節動作。主機通過調用經過修改后的libvirt的virDomainSetMemoryFlags接口,控制虛擬機內的內存管理驅動,調整虛擬機內存。
2.2 內存熱添加模塊
為了實現內存熱添加功能,首先需要在虛擬機的XML文件中添加slots和maxmem參數。其中maxmem表示虛擬機能擁有的最大內存值,考慮到目前各操作系統所能支持的最大內存,該值設為1TB。Slots表示內存插槽數,即每個虛擬機可內存熱添加的次數。考慮到內存熱添加次數過多會影響主機和虛擬機效率,目前該值設置為10.對libvirt端的qemuDomainSetMemoryFlags函數進行修改,增加內存熱添加的相關Flags標簽,執行熱添加的相關動作。當KVM虛擬機觸發內存熱添加操作時,內存管理系統調用修改過的qemuDomainSetMemoryFlags函數主要完成兩個動作。先調用object_add接口,為相應的虛擬機申請指定大小的內存,并完成相關的內存初始化操作。然后調用device_add接口將所申請的內存設備添加到對應的虛擬機中。更新虛擬機相關頁表,然后把該部分內存置成online狀態。并將虛擬機的Mem_guest_total更新為內存熱添加之后的值。
2.3 內存預留和保護模塊
虛擬機的內存大小,即為Host主機給對應的虛擬機進程所分配的內存大小。根據Linux系統自身的內存管理機制,如果當進程的某部分內存長期不使用時,該部分物理內存會被轉換到Swap區,被系統回收。這種情況下,虛機運行性能可能會大大下降。本模塊的主要作用就是避免上述情況的發生。首先在虛擬機的XML文件中添加一個mlock參數。該值必須在0-100之間。由用戶自行根據設定。Mem_mlock=Mem_guest_total *Mem_mlock/100表示虛擬機內存中被鎖定為最低物理內存的值。Mem_mlock這部分值,無論在何種情況下既不會被轉換到swap區,也不會被內存動態自動調節模塊所回收,從而保證虛擬機的運行效率。
本次測試使用的服務器的CPU型號為Intel(R)Xeon(R)E5-2620 v2@2.10GHz,內存為48GB,存儲大小為270GB。Host主機使用的操作系統為Ubuntn 12.04(內核)3.13.6.客戶機操作系統分別為較為常見的windows7和redhat6.5的64位系統。
內存超配測試:
測試主機內存在按不同百分比超配分配給虛擬機時,同一虛擬機在運行同一應用時,虛擬機是否被合理分配給了所需內存和應用運行完成所需的時間。如圖3所示結果表明在未使用本內存管理系統的情況下,在主機使用率在100%時,虛擬機的應用在運行時無法被分配到足夠的內存,虛擬機運行應用完成的時間也大大增加。這是因為在未使用本內存管理系統時,由于主機的虛擬化系統運行時也需要內存,在將全部內存分配給虛擬機時,勢必導致主機虛擬化系統無法獲得足夠內存,導致虛擬機運行性能下降。如圖4所示,在使用本內存管理系統情況下,主機可分配130%的內存給虛擬機。通過本內存管理系統的高效分配內存,虛擬機應用依舊能夠基本獲得所需內存。虛擬機應用運行所增加的時間也在可接受范圍內。由此可見,本內存管理系統能夠通過高效分配主機內存,實現主機內存的超配使用,具有顯著的應用價值。

圖3 未使用本內存管系統內存測試結果

圖4 使用本內存管系統內存測試結果
本文所提出的內存管理系統,主要由內存動態自動調節功能,內存熱添加功能和內存預留功能三部分組成。能夠在一定程度上實現Host主機內存的過量使用。并可以通過內存熱添加功能打破虛機的內存上限。而內存預留功能又能夠根據客戶不同的需求保證虛擬機的不同內存使用量。本系統設計了一種較為完善,高效的內存管理方案,有較好的實際應用價值。
[1]張偉哲,張宏莉。云計算平臺中多虛擬機內存協同化策略研究[J]。計算機學報,2011(12):2265-2677.
[2]許磊。基于云計算環境的虛擬機內存管理研究[D]。哈爾濱:哈爾濱工程大學,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]馬博。基于內存熱插拔的虛擬機動態內存管理系統[D]。武漢:華中科技大學,2012:8-14.