做了一点关于Memory Balloon的实验,发现有点东西和网上有的老博客里的略微有些许不同,特此整理实验步骤以及结果记录。
1. 在 物理机的 /boot/config-* 文件(该文件表明的是内核编译时的选项)中查找是否有CONFIG_VIRTIO_BALLOON=m ,一般来说,目前的Linux内核都已经有这个配置了。
另外,再检查一下运行的内核模块中是否有了 virtio_balloon:lsmod | grep virtio_balloon
注:这个检查个人理解既是基于host的,也是基于虚机的(见下)。但因为本人物理机上 CONFIG_VIRTIO_BALLOON=y , 因此不会grep出什么内容。
2. 用 virsh 来运行 QEMU Monitor 的命令:
1) 找出本物理机上的虚机情况,注意其 ID 一项
virsh list
另:
- 在Controller节点上运行 nova list , 可以看到虚机的名字(Name)
- 在Controller节点上运行 nova show <VM name> , 可以看到虚机的详细信息,如运行在哪一台物理机上
2) 运行 virsh qemu-monitor-command 来检查虚机的实际分配内存量
virsh qemu-monitor-command 1 --hmp "info balloon"
注意,这里的结果显示的是实际分配内存量(balloon),并不是配置内存量。比如,给虚机配置4GB内存,但实际分配量可以设置为3GB,这样,多出的1GB就可以任物理机使用了。
3) 设定虚机的内存实际分配量
virsh qemu-monitor-command 1 --hmp "balloon 512"
举例:假设在2)中得到的结果是2048(默认为MB),在本步骤设为512,则意味着要从该虚机让出1536MB给物理机去使用。注意,此时到虚机中运行 free -m ,一些老的文献会说“total仍为2048MB,但used这项会比原来增大1536MB”,但是根据笔者实际测试结果来看,在比较新的版本上(
Kernel 4.4.0,QEMU 2.5.0),是total这一项直接显示为512MB了而used并没有改变。也就是说,在新版KVM/QEMU中,很明确地减去了虚机total可用内存。
另:可使用 virsh setmem 命令来动态更改客户机的实际分配内存量(balloon):
virsh setmem <domain-id or domain-name> <Amount of memory in KB>
注意,这里最后一项的size的单位是
KB. 若是误当成MB来设,相当于给虚机设置了一个很小的可用内存,会引起虚机崩溃。
3. 2个实验
在虚机中运行 lsmod | grep virtio_balloon , 会发现虚机是含有 virtio_balloon 这个Kernel模块的。
此时,在虚机中运行 rmmod virtio_balloon 去卸载内核模块;
然后,在host中运行 virsh qemu-monitor-command 1 --hmp "balloon 1024" 去调节虚机total可用内存到1024MB(假设虚机原来total内存为2048MB),再去虚机中运行 free -m , 会发现虚机的total内存并没有减少;
最后,在虚机中运行 modprobe virtio_balloon 加载内核模块,然后再在虚机中运行 free -m , 会发现虚机内存自动减少为1024MB了。
同样,假设虚机原来total内存为2048MB,因为运行 “balloon 1024”而减小为1024MB了,此时再在虚机中卸载virtio_balloon模块,会导致虚机total内存恢复回2048MB.
(完)