写给普通大学生看的虚拟化科普
你有没有遇到过这种情况:
你的电脑装了 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 虚拟化感兴趣,欢迎在评论区交流!