一台电脑当两台用:PVE 的内存”气球”技术是怎么回事?

写给普通大学生看的虚拟化科普


你有没有遇到过这种情况:

你的电脑装了 Proxmox VE(PVE),跑了两三个虚拟机,结果发现物理内存只有 16G,但每个虚拟机你都想给 8G——加起来 24G,超过了物理内存,根本开不了机

这时候,PVE 里有一个叫 Ballooning(气球) 的技术,可以帮你解决这个问题。


一、什么是 Ballooning?🎈

气球技术其实就是让虚拟机把自己”用不完的内存”借给其他虚拟机用。

想象这样一个画面:

你有一个大房间(物理内存 16G),里面放了两个透明气球箱。

   ┌─ 虚拟机 A ────────────────┐     ┌─ 虚拟机 B ────────────────┐
   │                            │     │                            │
   │  运行中程序: 用了 3G        │     │  运行中程序: 用了 2G        │
   │                            │     │                            │
   │  🎈 气球: 占了 5G          │     │  🎈 气球: 占了 6G          │
   │  (这部分是它暂时不用的)      │     │  (这部分是它暂时不用的)      │
   │                            │     │                            │
   │  总共分配: 8G              │     │  总共分配: 8G              │
   └────────────────────────────┘     └────────────────────────────┘

   物理内存总量: 16G
   VM 分配总量: 8G + 8G = 16G ✅ 将将够用
   VM "宣称"总量: 8G + 8G = 16G

如果 VM A 的”气球”占 5G,VM B 的”气球”占 6G,那实际上那两个 VM 真正在用的加起来只有:

3G + 2G = 5G ✨

剩下的 11G 实际上还是空闲的,可以再开第三个虚拟机。

简单说:Ballooning 就是让虚拟机假装自己内存很大,但实际上把用不上的内存借出去。


二、为什么要搞这么复杂?

那为什么不每个虚拟机老老实实固定内存呢?

因为现实情况是:

时间段VM A(你的主力机)VM B(一个测试服务器)
白天上班用 6G,比较忙几乎没人访问,用 1G
晚上下班用 2G,空闲了备份任务跑起来,用 4G
周末没人用,1G 够了没人用,但有个小服务挂着

如果你固定分配 A=8G、B=4G,那就浪费了——白天 B 多出来的 3G 用不上,晚上 A 多出来的 6G 也用不上。

但如果有气球技术:

白天: A 需要 6G → 气球放气 → A 拿到足够内存 ✅
       B 只要 1G → 气球充气 → 省下 3G 给 A 用 ✅

晚上: A 只要 2G → 气球充气 → 省下 4G 给 B 用 ✅
       B 需要 4G → 气球放气 → B 拿到足够内存 ✅

啥也没干,内存自动分配好了。 这就是气球存在的意义。


三、气球怎么充气放气?

它不像你想象的那样是”动态调整”,而是靠一个驱动程序在虚拟机里面操作。

宿主机(PVE)看到 VM A 内存不够了:
  └→ 通知 VM A 里的气球驱动:"放气"
     └→ VM A 的驱动程序从系统申请更多内存页
        └→ VM A 可用内存变多 ✅

宿主机看到 VM A 内存富余了:
  └→ 通知 VM A 里的气球驱动:"充气"
     └→ 驱动程序把空闲内存页"挤"出来
        └→ 宿主机拿回这些内存,分给别的 VM ✅

这个驱动在 Linux 下叫 virtio_balloon,在 Windows 下叫 balloon.sys


四、Windows vs Linux:谁的气球更好用?🤔

先给结论:Linux 用得爽,Windows 用得勉强。

Linux 下的气球 ✅

  • Linux 内核原生就支持气球驱动,装系统时自动就有了
  • Linux 把内存分成很多类别,比如:
    • 进程正在用的 — 不能动
    • 文件缓存(Page Cache)— 随时可以回收,不影响性能
    • 完全空闲的 — 随便拿
  • 气球驱动可以轻松回收”文件缓存”和”空闲内存”,效率很高
  • 回收速度:不到 0.1 秒

真实例子: 一台 8G 的 Linux 虚拟机,设了 balloon 下限 2G,日常用 4G。气球能成功回收约 3.5G 给宿主机。而且虚拟机里的程序几乎感觉不到

Windows 下的气球 ⚠️

Windows 跟 Linux 的架构不一样:

  • 气球驱动需要额外安装(Fedora 项目提供的 VirtIO 驱动里带的)
  • Windows 把内存管理得很”死”:
    • 进程正在用的 — 不能动
    • Standby List(待命列表) — 系统准备随时用,气球只能拿一部分
    • 文件缓存 — Windows 自己也管得很严,不给气球随便碰
  • 气球驱动能拿到的,主要是真正空闲的内存页
  • 回收速度:0.3~0.8 秒,有明显延迟

真实例子: 同样 8G 的 Windows 10 虚拟机,设了 balloon 下限 4G,日常用 4G。气球只能回收约 1.5G。而且当宿主机突然要回收内存时,Windows VM 可能会卡一下

直观对比表格

对比项🐧 Linux 虚拟机🪟 Windows 虚拟机
驱动来源Linux 内核自带需要额外安装 VirtIO 驱动
可回收量(8G 机器举例)约 3.5G约 1.5G
回收响应速度< 0.1 秒0.3 ~ 0.8 秒
压缩到最低能到什么程度分配量的 25%分配量的 60%
程序会不会感觉到卡顿基本不会有可能
驱动稳定吗?非常稳定比较稳定

为什么 Windows 会这样?🤷

根本原因在于 Windows 对内存的管理比 Linux “霸道”:

Linux 的内存哲学:
  "用不上的内存就是浪费,谁要谁拿去"

Windows 的内存哲学:
  "我申请了就是我的,说不给你就不给你"

简单说,Linux 觉得自己够用就行,多余的内存可以借出去;Windows 觉得”我现在用不上,但说不定下一秒就要用,先留着”。


五、给你的实用建议 💡

如果你是 Windows 用户

记住这三条就够了:

┌─────────────────────────────────────────────────┐
│  1️⃣ 主力工作机(Windows 10/11,经常用)          │
│     → 关掉 Ballooning,固定分配内存              │
│     → 原因:你需要稳定的性能,气球可能导致偶尔卡顿  │
│     → 比如你的笔记本/主力台式机,给够内存就别省了   │
├─────────────────────────────────────────────────┤
│  2️⃣ 轻负载服务(Windows Server,DC/DNS等)       │
│     → 可以开 Ballooning,但下限设高一点           │
│     → 设分配量 4G,Balloon 下限 3G               │
│     → 这样最多能省出 1G,同时不会影响服务稳定性     │
├─────────────────────────────────────────────────┤
│  3️⃣ 如果你在 PVE 里跑 Windows,记得装 VirtIO     │
│     → 不装 VirtIO 驱动就没有气球功能              │
│     → 装完驱动后,在 VM 配置里加上 balloon 参数    │
└─────────────────────────────────────────────────┘

如果你是 Linux 用户(放心用)

Linux 下的 Ballooning 非常成熟:

  • 服务器随便开,下限设低一点(甚至设 512MB)
  • 不会影响性能
  • 驱动内核自带,不需要额外装东西

六、最后总结 📝

Ballooning 就像一个"内存银行":
  - 有闲钱(空闲内存)的存进去
  - 有需要的取出来
  - 大家都保证留够生活费(balloon 下限)

Linux:           ✅ 老实人,说存就存,说取就取
Windows 10/11:   ⚠️ 存钱不积极,取钱还慢半拍
但重启之后:       ✅ 谁都能把钱全吐出来

所以如果你是 PVE 用户,Linux 虚拟机随便开 Ballooning,Windows 虚拟机看情况开——主力机直接关掉省心,轻负载服务可以开着节约一点内存。


如果你对 PVE 虚拟化感兴趣,欢迎在评论区交流!

发表评论