Virtio balloon实现机理
balloon driver是一种驱动程序,可以从客户机汲取内存或追添内存给予客户机。从理论上,如果你的客户机需要更多的内存,你可以使用balloonDriver给客户机提供更多内存;如果主机需要从客户机汲取内存,balloonDriver也可以做到。无论是给客户机提供更多内存还是主机从客户机汲取内存都不需要暂停或者重启客户机,完全可以动态实现,相当于实现客户机内存的热插拔(hot-plugin)。
客户机内核驱动中由一个称之为virtio_balloon的驱动,它的作用既可以膨胀自己使用内存大小也可以缩减内存使用量(可以缩减至几近于无),见于如下图解
当balloon driver膨胀时,运行在客户机上的正常应用程序将突然间减少占用内存。当没有足够内存时,客户机就当balloonDriver占用的内存不存在,而使用交换空间或者开启OOM-killer选择性的杀死一些进程以求释放些内存共使用(balloon本身是不可换出,不可杀死的)。
那么balloon driver占用这些内存具有什么含义呢?这些被balloon driver占用的内存正常应用程序又不能使用,这不是浪费吗?其实这么做主要考虑两点:
-
客户机的balloon driver可以通过virtio通道与主机通信,并接受主机给它的伸/缩信号。由客户机协作,但不直接控制balloon.
-
在balloon中的内存页从客户机中取消映射并交回主机,主机可以将这些内存拿出来给其他客户机。这就像客户机的内存被抠出一块出来,如下图解 :
在Libvirt中有两项可以控制的设置项称为currentMemory(当前内存)和maxMemory(最大内存),如下图解:
maxMemory(最大内存,在libvirt xml文件中为memory)是在客户机启动时分配给客户机的内存。当前,KVM/Xen客户机不能使用不能超过该值。
currentMemory(当前内存)是可以分配给客户机中正常应用使用的内存阈值。balloon将占用(充满)余下的内存并将这些内存交回主机,主机可以拿来在任何需要的地方使用。可以手动地调整currentMemory:编辑libvirt xml文件或者使用virtsh setmem命令。
理想情况,基于主机和客户机动态申请/释放内存的需求,balloon driver自动(动态地)伸缩以满足主机/客户机。但是目前Libvirt中balloon driver没有实现该特性,只能通过virsh指令或修改客户机配置文件实现,还达不到根据主机/客户机实际负载动态地、自适应地调整。关于ballon driver自适应调整在QEMU中有相关补丁实现,可以参考相关文档。
[参考文档]
http://rwmj.wordpress.com/2010/07/17/virtio-balloon/ [需要梯子]
http://blog.braastad.org/?p=211 [需要梯子]
http://www.linux-kvm.org/page/Projects/auto-ballooning
本文档参考如上帖子或官方文档意译(添加个人理解测试以及其他文档或评论相关内容)