基于云计算平台的虚拟机内存管理系统
2016-12-26杭州电子科技大学电子信息学院韩高帅程知群
杭州电子科技大学电子信息学院 韩高帅 程知群 章 超
基于云计算平台的虚拟机内存管理系统
杭州电子科技大学电子信息学院 韩高帅 程知群 章 超
在云计算虚拟化平台中,虚拟机在运行不同的业务应用时,对内存通常会有不同的需求。这种情况下,如果采用静态的内存分配方式,往往会造成内存资源无法得到合理分配和使用。目前传统的内存管理系统只能将内存性能提高10%左右。本文基于KVM虚拟化方案设计了由内存动态调整,内存热添加,内存预留等几个模块组成的虚拟机内存管理系统。从实验结果可知在使用本内存管理系统的情况下,能够有效的将系统的整体内存性能提高25-30%。
云计算;虚拟机;内存管理;KVM
0 引言
虚拟化技术能够将各种计算机资源进行抽象化并进行统一表示,是实现云计算平台的技术基础。可以有效提高计算机资源的使用效率[1]。而内存虚拟化管理在整个虚拟化系统中是实现最复杂的部分,并且也是提高虚拟机运行效率的关键所在[2]。目前国内外的内存虚拟化管理系统通常需要对虚拟机客户机系统做较大的修改,例如基于Xen虚拟化方案的内存管理系统[3]。而常见的VMware虚拟机内存管理系统方案无法保证虚拟机的最小物理内存持有量[4]。目前,国内外的虚拟机内存管理系统通常能实现内存超配110%左右。本文系统使用Linux自带的KVM虚拟化方案,无需修改虚拟机系统[5]。另外,本系统的虚拟机内存预留技术,能够保证虚拟机最小物理内存持有量从而提升虚拟机运行性能。内存热添加技术能够在线增加虚机的内存从而打破虚机内存上限。动态内存管理技术能够依据虚拟机运行时内存需求的变化来实时改变虚拟机的内存大小。本内存管理系统通过结合使用上述的内存动态调整,内存预留和内存热添加技术能够实现系统内存超配近130%。
图1 系统总体结构图
图2 系统模块图
1 系统设计
本设计中,虚拟机采用KVM虚拟化方案,并使用libvirt作为虚拟机管理工具,提供虚拟化平台管理应用程序接口和virsh命令行管理工具。本设计方案主要使用C语言,shell和python对KVM,qemu,libvirt进行开发和优化实现。虚拟机的相关信息使用XML格式的文件保存。本系统的总体结构如图1所示。每个虚拟机以一个运行在Host主机上的进程的方式存在,虚拟机的相关配置在虚拟机进程启动时从对应的虚拟机XML配置文件的读取。当虚拟机需要进行内存访问时虚拟机进程切换到内核态,使用KVM内核模块进行内存模拟,并将结果返回虚拟机。如果是进行IO等访问则在用户态使用Qemu进行模拟,返回结果[6]。内存管理系统为一个运行在Host主机上的守护进程,该守护进程通过UNIX域套接字与相应虚拟机进行交互与通信。通过Libvirt管理工具管理虚拟机的资源分配及控制虚拟机的各种动作。在虚拟机中也有内存管理的相关驱动,负责虚拟机内存信息的收集和上报给Host主机,并接收主机的相关内存调整指令对虚拟机内存进行调整。如图2所示本系统主要有三部分组成:内存动态调节模块,内存热添加模块以及内存预留模块。
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区,也不会被内存动态自动调节模块所回收,从而保证虚拟机的运行效率。
3 系统测试结果
本次测试使用的服务器的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 使用本内存管系统内存测试结果
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.