前言

一般来说,如果你要为某一台虚拟机调整它所分配到的内存大小,那么你应当做的是:先关机,然后调整内存分配,再重新开机。

但是 Balloon(气球内存)允许虚拟机在不关机的情况下,动态地得到设置阈值内的内存大小。

气球内存属于内存超分的一种。类似的内存超分技术还有内存交换(Swapping)、页共享(Page Shaing)等,这里不过多赘述。

核心思想

KVM Ballooning 的核心思想是:通过一个安装在客户机(Guest OS)内部的特殊驱动程序(Balloon Driver),动态地回收客户机暂时未使用的内存,并将其归还给宿主机(Host),从而让宿主机能够更高效地全局分配内存给其他更需要资源的虚拟机。

你可以把它想象成一个可以“吹气”和“放气”的气球:

  • 吹气(Inflate):气球膨胀,占用客户机内部的内存,相当于从客户机回收内存。
  • 放气(Deflate):气球缩小,释放出内存给客户机使用,相当于将内存归还给客户机。

这个“气球”本身是客户机内核地址空间的一部分。

你为什么需要气球

在没有 Ballooning 的情况下,宿主机管理虚拟机内存会遇到一个难题:内存超售(Memory Overcommitment) 带来的不确定性。

  • 宿主机可以分配总量超过其物理内存的虚拟内存给所有虚拟机。例如,宿主机有 16GB 物理内存,可以创建 4 台虚拟机,每台分配 8GB(总共 32GB)。这依赖于一个事实:虚拟机通常不会 100% 使用其所有分配的内存。
  • 当所有虚拟机都开始使用大量内存,宿主机物理内存即将耗尽时,宿主机无法精确地知道哪台虚拟机的内存利用率低,可以安全地回收。宿主机只能采取激进的手段,比如直接合并相同内存页,或者更极端的 Swap,将虚拟机内存换到磁盘上,这会导致性能急剧下降。

Ballooning 解决了这个精确回收的问题。它让客户机操作系统自己决定哪些内存页是可以被回收的(通常是未使用的缓存或缓冲),从而实现更安全、更高效的内存回收。

工作原理

这里先放一张陈年老图(笑)

参与组件

温馨提示:这里涉及到三个概念,如果不理解可以先查阅相关资料:

  1. 宿主机上的 Hypervisor(QEMU/KVM)
  2. 客户机操作系统(Guest OS)
  3. 客户机内的 Virtio-Balloon 驱动程序

内存回收(气球膨胀 - Inflate)

宿主机的物理内存不足时,会向虚拟机请求将它们的气球膨胀(其实就是归还内存)

虚拟机上的驱动收到请求后,会尝试将自己的空闲内存归还给虚拟机。如果它们有空闲内存,那么就会直接将它们冲入气球;如果虚拟机本身的内存也比较紧张,甚至可能会使用自己的 Swap。

然后,这些内存会被锁定,虚拟机内核不会再尝试操作这些内存。最后,宿主机得到内存归还的结果,就可以直接使用这些内存了。

内存归还(气球放气 - Deflate)

虚拟机的内存需求变大时,可以反向请求所需内存。

QEMU 让气球放气 → Ballon 驱动释放内存 → 这些内存再次被虚拟机回收

优缺点

优点:

  • 高效的内存超售:允许宿主机运行比物理内存容量更多的虚拟机,提高资源利用率。
  • 动态调整:无需关闭或重启虚拟机,即可调整其内存大小。
  • 协作式回收:由客户机OS决定回收哪些内存,比宿主机强制交换(Swapping)更智能、更高效,性能损耗更低。
  • 按需分配:内存资源可以像云环境一样“弹性”分配。

缺点:

  • 并非所有 VM 操作系统都内置了气球内存驱动(例如 Windows 可能需要自己安装一下 virtio 驱动)
  • 对直通设备不友好(例如,我也是 ProxmoxVE 玩家)
  • VM 操作系统并不知道自己的内存去了哪里,它能看见的只有一个硕大的进程在无尽的吃内存(怪好笑的)

总结

KVM Ballooning 是一种优雅的协作式内存回收机制。它通过在客户机内部放置一个“间谍”(气球驱动),让客户机主动配合宿主机进行内存回收,解决了宿主机在内存超售环境下管理内存的盲区问题。

它是虚拟化环境中实现高效内存管理和动态资源调度的一项关键技术,被广泛用于各类基于 KVM 的云平台和虚拟化解决方案中。

版权申明

  • reward_image1
此作者没有提供个人介绍。
最后更新于 2025-12-13