物理内存只有 4GB,凭什么能跑出 16GB 的虚拟机?
一台物理主机只有 4GB 内存,却同时跑着 4 台、每台配置 4GB 的虚拟机,账面上要 16GB。
主机没崩,业务还正常跑。
这事儿听起来违反常识,但在虚拟化和云平台里天天发生。
它的名字叫内存超分配(Memory Overcommitment),也有人叫内存超配。
什么是内存超分配
内存超分配是指:分配给所有虚拟机的内存总量,超过了物理主机实际拥有的内存。
打个比方。
物理主机 4GB 内存,不算 VMM(虚拟机监控器)本身的开销。
我开第一台虚机,配置 4GB。
再开第二台,还是 4GB。
第三台、第四台照旧。
四台加起来,配置内存 4 × 4 = 16GB,可物理内存就 4GB。
这种「卖超」的玩法,就是内存超分配。
为什么敢这么干
核心就一句话:虚拟机配的内存,平时根本用不满。
一个应用跑在物理机上,内存平均利用率往往只有 10%~20%。
剩下的大半都是闲置的。
虚拟化把多台虚机塞进一台物理机后,超分配等于把这些闲置内存「凑」起来复用,利用率一下就上去了。
道理跟航空公司超售机票一样。
不是每个买了票的人都会准时登机,所以航司敢卖出比座位更多的票。
内存超分配赌的也是「大家不会同时把内存用满」。
几个容易搞混的概念
VMware 这类平台里有几个词经常被混淆,先理清楚。
| 概念 | 含义 | 说明 |
|---|---|---|
| Configured(配置内存) | 虚机被设定的最大内存 | 上面例子里的 4GB |
| Reservation(预留) | 保证给虚机的最小物理内存 | 例子里的 1GB,主机一定兜底这部分 |
| Limit(上限) | 虚机最多能拿到的物理内存 | 防止单台虚机吃光主机 |
| Active(活跃内存) | 虚机当前真正在用的内存 | 超分配真正关心的数字 |
超分配能成立,靠的就是「配置内存」远大于「活跃内存」这个差。
预留(Reservation)则是安全垫,确保每台虚机至少有一块物理内存不会被抢走。
靠什么技术撑着
光靠「赌」是不够的。
万一虚机真的集体发力,把内存都用上了怎么办?
虚拟化平台准备了好几招来回收和腾挪内存。
内存气球(Ballooning):
宿主机通过装在虚机里的 balloon 驱动,向虚机「要回」暂时用不到的内存,再分给更紧张的虚机。
页面共享(TPS / KSM):
多台虚机里内容完全相同的内存页,只在物理上保留一份。
KVM 里这个机制叫 KSM(Kernel Same-page Merging),跑同款操作系统的虚机能省下可观的内存。
内存压缩:
在换出到磁盘之前,先把内存页压缩一下塞回内存,比读写磁盘快得多。
Swap 到磁盘:
实在腾不出来,就把冷的内存页换到磁盘上。
这一招代价最大,因为磁盘比内存慢几个数量级。
这几招通常按「气球 → 压缩 → swap」的顺序触发,越往后性能损失越大。
超分配不是白嫖,是有代价的
为了省机器,把超分配比例拉得很高,平时一点事没有。
结果某天几台虚机的定时任务撞到一起同时跑批,活跃内存瞬间顶满。
主机疯狂 swap,所有虚机一起卡成幻灯片,监控告警炸了一片。
这就是超分配的风险所在。
一旦多台虚机的内存需求同时冲高,物理内存兜不住,轻则触发大量 swap 导致整机性能雪崩,重则触发 OOM(Out Of Memory)把进程甚至虚机干掉。
所以超分配比例不是越高越好。
关键业务该配预留就配预留,再配上内存使用率告警,别等真出事才发现。
关键数据一览
- 单应用内存平均利用率:约 10%~20%
- 例子中的超分配比例:16GB ÷ 4GB = 4 倍
- 内存回收代价排序:气球 < 页面共享 < 压缩 < swap 到磁盘
- swap 触发后的性能下降:磁盘比内存慢约 1000 倍以上
常见问题 FAQ
Q1. 内存超分配和 CPU 超分配是一回事吗?
思路一样,都是「卖超」复用闲置资源,但内存比 CPU 危险得多。
CPU 抢不到顶多排队等一下,内存抢不到可能直接 OOM 杀进程。
Q2. 超分配比例设多少合适?
没有标准答案,看业务负载。
测试、开发环境可以激进些(2~4 倍甚至更高),生产关键业务建议保守,配好预留并留足余量。
Q3. 内存气球会不会把虚机里的内存抢爆?
不会无限抢。
balloon 驱动只回收虚机当前不用的空闲内存,虚机真要用的时候会再「放气」还回去。
Q4. 关掉 swap 是不是就安全了?
恰恰相反。
关掉 swap 后内存一旦不够,没有缓冲直接走 OOM,风险更高。
正确做法是控制超分配比例,而不是简单关 swap。
写在最后
内存超分配的本质,是用「大家不会同时满载」这个统计规律,把闲置内存榨出价值。
它确实能显著提升资源利用率,省下真金白银。
但它是一笔有风险的买卖,赌的是负载的随机性。
理解清楚配置内存、活跃内存、预留这几个概念,再配好监控和预留,才能既享受超分配的好处,又不至于被它反噬。
如果你在生产环境用超分配踩过坑,或者对气球、KSM 这些机制还有疑问,欢迎在评论区聊聊~~~
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!
本文原文链接: https://fiveyoboy.com/articles/memory-overcommitment/
备用原文链接: https://blog.fiveyoboy.com/articles/memory-overcommitment/