虚拟机预留内存没有万能比例,关键业务建议按峰值需求留足余量、尽量不超分;普通业务可结合监控适度超分,开发测试可更激进,但必须守住swap和OOM这条底线。
很多人在虚拟化平台里看到“内存预留”这个选项,第一反应是拉到最大,结果宿主机能跑的虚拟机越来越少,资源账单却越来越贵,也有人完全不管,靠超分硬撑,最后业务高峰一到,虚拟机开始swap,延迟飙升,预留内存到底怎么定,本质上是在资源利用率和性能稳定性之间找平衡。
虚拟机预留内存多少合适?先看三个核心判断维度
业务峰值和SLA决定预留下限
先别问“别人预留多少”,先看你的业务能接受多大抖动。
- 常驻内存:系统启动后稳定占用的部分,比如操作系统、运行时、缓存基线。
- 峰值内存:业务高峰、批处理、大查询、突发流量时短时间冲高的部分。
- 突发内存:缓存、连接池、临时对象带来的额外占用。
如果业务SLA要求低延迟、不能卡顿,预留量应覆盖“常驻+峰值+一小段安全余量”,如果只是内部报表、开发测试,预留可以只覆盖常驻,峰值靠宿主空闲内存兜底,举个例子,某Java服务常驻8GB,高峰10GB,预留12GB左右通常比只预留8GB更稳,但具体还要看宿主压力和监控曲线。
超分比例和宿主资源决定预留上限
内存超分不是免费午餐,它依赖宿主有空闲页、能快速回收,或者用balloon、KSM、swap来腾挪,业内专家指出,内存超分只有在宿主有足够空闲页和快速回收能力时才安全。
- 宿主空闲内存越少,预留越要保守。
- 用了balloon驱动,虚拟机可能被回收内存,性能会波动。
- 开了KSM,相同页合并能省内存,但CPU开销会上升。
- 一旦走到swap,数据库和实时业务基本会出问题。
预留上限不是由单台虚拟机决定,而是由整台宿主的可用内存、超分策略、NUMA结构共同决定,在北京、上海等地域的IDC里,跨NUMA节点的内存超分还要额外看宿主亲和性,否则远程内存访问会拖慢延迟敏感业务。
监控数据比经验值更可靠
别凭感觉调,先看数据:
- VMware:用esxtop看MEM、SWAP、 balloon、steal。
- Linux虚拟机:
free -m、vmstat 1、sar -r 1、cat /proc/meminfo。 - 容器节点:
kubectl top pod、kubectl describe node看Allocated resources。 - 长期趋势:连续观察一到两周,覆盖业务高峰和低谷。

看几个关键指标:内存使用率是否长期贴顶、swap in/out是否非零、balloon是否频繁回收、steal time是否升高,只要swap持续出现,就说明预留或规格偏紧。
虚拟机内存预留和限制的区别是什么?搞混容易出性能瓶颈
预留是保底,限制是封顶
- 预留:保证虚拟机至少能拿到的物理内存,预留越高,调度器越不敢把这块内存超分给别人。
- 限制:虚拟机最多能用的内存上限,限制太低,业务高峰会触发回收或OOM。
- 份额:资源竞争时的优先级权重,份额高,抢内存时更占优,但不等于保底。
三者关系可以记成:预留管下限,限制管上限,份额管竞争。
超分场景下预留如何影响调度
预留高的虚拟机,相当于提前占了座位,宿主剩余可超分内存减少,能开的虚拟机数量下降,预留低的虚拟机,虽然密度上去了,但高峰时可能被balloon回收,或者被宿主动态迁移、swap。
行业共识认为,数据库和实时交易类业务应尽量避免内存swap,对这类业务,预留接近峰值通常比追求密度更划算。
常见误区:预留越大越好
预留拉满,单台虚拟机确实稳,但代价是:
- 宿主可调度内存减少,资源浪费。
- 其他虚拟机可能因为抢不到内存而性能下降。
- HA准入控制可能拒绝故障切换,因为预留资源不够。
- 云账单或私有云扩容成本上升。
预留的目标不是“最大”,而是“刚好挡住性能瓶颈”。
云服务器虚拟机内存预留怎么设置?不同平台实操路径
VMware vSphere:预留、限制与份额
操作路径:
- 关闭虚拟机或确认支持热改。
- 右键虚拟机,编辑设置。
- 找到“资源”选项卡,选择“内存”。
- 设置“预留”,单位MB或GB。
- “限制”可留空,或设为业务上限。
- 检查“份额”是否符合业务优先级。
- 确认集群HA准入控制还有足够预留资源。

如果勾选“预留所有客户机内存”,虚拟机启动时就会锁定全部内存,这个选项适合关键业务,但会显著降低整合密度。
KVM/QEMU与OpenStack:用cgroup和XML控制
KVM层面可以编辑XML:
virsh edit 虚拟机名- 在
<memtune>里设置<hard_limit>,单位KiB。 - 用
<memoryBacking><hugepages/>启用大页,减少TLB miss。 - 用
<numatune>绑定NUMA节点,降低跨节点访问。
OpenStack里,预留通常通过flavor extra specs和NUMA策略间接实现:
hw:mem_page_size=large启用大页。hw:cpu_policy=dedicated配合CPU绑定。hw:numa_nodes=1控制NUMA拓扑。- 节点侧用
systemd-cgls、/sys/fs/cgroup/memory检查cgroup限制。
公有云:实例规格与弹性内存策略
大多数公有云不直接暴露“预留内存”选项,你买什么规格,就相当于预留了什么内存,需要注意:
- 共享型、突发性能实例可能有资源争抢,延迟不如独享型稳定。
- 弹性内存、热变配要看平台是否支持,以及是否需要重启。
- 看SLA和积分机制,别只看便宜。
开发测试、数据库、容器场景下预留多少更合理
开发测试环境:适度超分,预留低一些
开发测试机通常CPU和内存利用率低,可以只预留常驻内存,让峰值靠宿主空闲内存兜底,但快照、克隆、批量启动时容易集中抢内存,最好错峰操作。
数据库与中间件:预留接近峰值,避免swap
MySQL、PostgreSQL、Redis、Kafka这类业务,对内存延迟敏感。
- 预留应覆盖缓冲池、连接、排序、复制缓存等峰值。
- 尽量启用大页,减少页表开销。
- 绑定NUMA节点,避免跨节点内存访问。
- 监控swap,只要持续非零,就加预留或升规格。
容器与Kubernetes:requests/limits与虚拟机预留的映射
容器里的requests接近预留,limits接近限制,节点上还要留出kube-reserved和system-reserved,如果虚拟机本身预留不足,容器QoS再高也可能被宿主拖累。

预算有限时,如何避免虚拟机内存浪费与性能瓶颈?
用监控找浪费:内存使用率、swap、balloon、steal
先找出“占着内存不用”的虚拟机:
- 内存使用率长期低于常驻基线。
- swap长期为零,balloon从未触发。
- 业务低谷期内存大量空闲。
- 快照、克隆机长期闲置。
对这类虚拟机,可以降低预留、缩小规格或合并部署。
分级预留:核心业务、普通业务、边缘业务
| 业务类型 | 预留策略 | 超分建议 | 主要风险 |
|---|---|---|---|
| 核心数据库 | 覆盖峰值加余量 | 不超分或极低 | OOM、延迟抖动 |
| 普通Web/API | 覆盖常驻加突发 | 适度超分 | 高峰变慢 |
| 开发测试 | 覆盖常驻 | 较高超分 | 偶发卡顿 |
| 批处理/离线 | 按窗口峰值 | 可动态调整 | 任务超时 |
调整节奏:先观察、再小步调、后固化
- 观察一到两周,记录高峰和低谷。
- 每次只调一小步,比如降一档预留。
- 调完观察swap、balloon、业务延迟。
- 稳定后固化到模板或IaC脚本。
- 业务变更、版本升级后重新评估。
虚拟机预留内存常见问题解答
虚拟机预留内存多少合适?有没有通用公式?
没有通用数值,可用公式:预留=常驻内存+峰值增量+安全余量,安全余量看业务SLA、宿主压力和是否允许超分,关键业务尽量覆盖峰值,普通业务覆盖常驻即可。
虚拟机内存预留越大性能越好吗?
不是,预留越大,单台虚拟机越稳,但宿主可调度内存越少,整合密度越低,浪费越明显,预留的目标是避免swap和关键争抢,而不是把所有内存都锁死。
云服务器虚拟机内存预留怎么设置才不浪费?
先看监控,确认常驻和峰值;再按核心、普通、边缘分级;最后小步调整并观察swap、balloon、steal,公有云选匹配规格,私有云在vSphere、KVM或OpenStack里按业务SLA设置预留,关键业务不超分,非关键业务适度超分,开发测试可更激进。