目录

物理内存只有 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/