内存超分,是指分配给虚拟机的内存总和大于实际可用的物理内存总数。这样做的前提是,虚拟机操作系统里的内存不可能一直处于用满的状态。
但是,超分又不能过大,最好不要超过物理内存和 swap 的总和。否则,当所有客户机都处于较高内存使用率的情况下,会出现虚拟机因内存不足而被关机的情况。
内存超分的实现方式:内存交换(swapping)、气球(ballooning)、页共享(page sharing)。
使用交换空间来弥补内存不足,给虚拟机分配内存的时候,将物理机 swap 空间分配给虚拟机使用,这种方式性能要低一些。
通过 KSM(Kernel SamePage Merging)合并多个虚拟机进程使用的相同内存页,KSM 技术可以让内核在多个进程间共享完全相同的页。
KSM 让内核扫描正在运行的程序并比较它们的内存,如果发现内存页是完全相同的,就将它们合并成一个内存页,并标识 “写时复制”。如果有进程尝试去修改标识为 “写时复制” 的合并内存页,就为该进程复制出一个新的内存页来给其使用。
事实上,虚拟机运行相同的操作系统或者应用程序时,会存在大量完全相同的内存页。
HostOS 内存不足了就会找 GuestOS 要内存来使用,通常情况下虚拟机需要先关机,调整内存配置之后再开机。
Ballooning 技术可以不对虚拟机关机就实现内存的调整,通过 ballooning 技术虚拟机释放空闲内存到虚拟机内的 “气球” 中,“气球” 中的内存可以供 Host 使用。
ballooning 是一种让内存超分的有效机制。例如:在一个为 8GB 的 Host 上,有 6 个内存为 2GB 的虚拟机(A、B、C、D、E、F),当在一段时间内 A,B,C 的负载很轻,就通过 ballooning 将其内存降到 512 M,这样 512M * 3 + 2G * 3 < 8G
。看起来 8G 内存,每个客户机分不到 2G 内存,实际上每个客户机可以使用到 2G 内存。
当同一个物理机上的多个虚拟机之间出现内存竞争时,Hypervisor 将轮询物理主机上所有的虚拟机,通过内存气球驱动(virio_balloon)自动回收虚拟机中的空闲内存。内存气球驱动回收机制能够最大限度的提高内存资源的利用率。
内存气球位于虚拟机中,内存气球 “膨胀” 则是虚拟机将内存释放给宿主机,内存气球 “压缩” 则是宿主机将内存还给虚拟机。
系统可以请求虚拟机回收已分配给它的部分内存,虚拟机会释放其空闲的内存。
假如客户机也内存不足,可能会导致其回收部分使用中的内存,这部分被回收的内存可能会被换出到客户机的交换分区 swap 中。
可以让宿主机的内存气球压缩,释放出内存气球中的部分内存让客户机使用。
Ballooning 价值:
Ballooning 优点:
Ballooning 缺点:
KVM Ballooning 原理
总结: 内存气球是一种内存超分技术,通过虚拟机中的 virtio_balloon 驱动调节虚拟机的可用内存,实现云计算平台中对虚拟机可用内存的动态分配控制。
内存气球膨胀,虚拟机可用内存减少,宿主机可用内存增加。
内存气球压缩,虚拟机可用内存增加,宿主机可用内存减少。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。