目录

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