PVE 踩坑笔记:在线迁移提示目标节点内存不足,Web 显示目标节点还有大量空闲内存
一、故障表现
- 集群状态正常,节点之间网络、存储满足在线迁移条件
- Web 监控面板目标节点内存还有大量剩余,swap 使用率很低
- 发起在线迁移直接提示内存不足,拒绝开始迁移
- 关闭其他虚拟机释放内存后,有可能迁移成功;也有可能释放一部分依旧报错
- 虚拟机开启内存气球(balloon),虚拟机内实际占用内存远小于配置内存
- 宿主机 free 命令看空闲内存充足,和 PVE 迁移校验结果不一致
典型特征:操作系统层面内存充足,但 PVE 的迁移预检查算法判定内存不够,属于统计口径差异带来的经典迁移坑。
二、原理简单说明
PVE 做在线迁移预校验时,默认按虚拟机配置的最大内存(memory)来评估需要的资源,而不是虚拟机当前实际占用内存。 哪怕开启了 balloon 内存气球,虚拟机现在只用了 4G,但是 VM 设置内存是 16G,迁移校验依旧按 16G 去预留。 计算逻辑大致: 目标节点可用 = 节点总内存 - 所有 VM 配置内存总和 - 宿主机系统预留内存 而 Web 页面、free 命令显示的是实时已经消耗的内存(balloon 压缩后实际占用)。 两者统计口径完全不同,就出现 “看着内存很多,不让迁移”。 另外还有一个因素:在线迁移需要额外内存缓存用于迁移过程的内存页拷贝,也会占用预留额度。
三、排查顺序
- 查看目标节点所有虚拟机配置内存总和
# 在目标节点统计所有VM的设定内存
qm list | awk '{print $3}' | grep -E '^[0-9]+$' | awk '{sum+=$1} END{print sum/1024 " GB"}'
这个是 PVE 校验用的总申请内存,不是实时占用。
- 查看节点总内存
free -h
- 查看当前虚拟机内存配置,确认是否开启 balloon
qm config 100
查看 memory、balloon 参数。balloon=0 代表关闭气球,balloon=1 开启。
- 查看节点宿主机预留内存设置
cat /etc/pve/nodes/<节点名>/config
查找 memory 预留配置。
- 查看迁移详细任务日志,确认报错原文
四、分场景修复方案
场景 1:开启 balloon,但迁移校验不采信实时占用(最高发)
balloon 只能用来在虚拟机运行后动态降低内存占用,无法绕过迁移前的内存校验。 PVE 迁移安全机制:假设迁移过程中虚拟机随时可以膨胀到配置的最大 memory,所以必须预留足额上限内存。
方案 A:临时调低待迁移 VM 的内存上限(关机修改,降低 memory 值,迁移完成再调回去); 方案 B:目标节点关闭一部分虚拟机,释放出等于该 VM 配置内存大小的额度; 方案 C:使用离线迁移(停机迁移),离线迁移校验逻辑宽松很多。
坑:很多人以为开了 balloon 就能超配迁移,在线热迁移不支持靠 balloon 超配。
场景 2:节点设置了宿主机内存预留值
PVE 可以给节点设置宿主机最小预留内存,保障系统、corosync、QEMU 等基础进程不被抢占。 预留内存不会分配给虚拟机,会从可分配内存里面直接扣除。 配置示例:
memory: 8192
代表该节点强制预留 8G 给宿主机,不允许虚拟机使用。 如果预留设置过大,会大幅减少可分配内存额度。 查看和修改:节点配置 → 内存预留。按需调小,不要盲目改太小,避免宿主机 OOM。
场景 3:节点存在 HA 虚拟机,HA 资源有内存资源约束
如果目标节点有 HA 托管虚拟机,HA 资源管理器(crm)也会统计资源预留,HA 策略不允许节点内存资源超限。 就算普通迁移校验放过,HA 层面也会拦截,或者间接影响可用额度。 查看 HA 资源状态:
ha-manager status
HA 环境下资源算的也是配置内存上限,不是实时内存。
场景 4:内存超配模式没有开启(overcommit)
PVE 默认不开启内存超配,严格按照 VM 配置内存做资源预算。 如果业务需要内存超配(依赖 balloon、业务平时内存跑不满),可以开启内存超配。
⚠️ 风险很高:超配之后 PVE 不再做严格内存预算校验,业务突发内存暴涨会导致宿主机 swap 飙升、OOM 杀虚拟机。仅适合明确可控的业务。 开启路径:数据中心 → 选项 → 内存超量提交。 可选:
none(不超配,默认)、server、desktop。 server 模式适合服务器场景,允许一定程度超配。
场景 5:迁移时内存脏页速度太快,迁移缓冲区预估不足
少数情况:节点额度刚好卡线,虚拟机写入内存速度快,迁移需要额外缓冲空间,校验直接判定不足。 处理:降低虚拟机负载,减少内存脏页产生速度之后再迁移。
五、验证修复
调整完成后,重新发起在线迁移,不再报内存不足,迁移流程正常开始拷贝内存页即为修复。
六、高频踩坑点
- 拿 free 或者 Web 监控的实时内存占用,去对标 PVE 迁移校验规则,两个不是一套统计标准;
- 误以为开启 balloon 就可以自由超配热迁移,忽略热迁移校验取 memory 上限;
- 不知道节点内存预留参数,预留吃掉一大块内存额度,一直找不到原因;
- 盲目开启内存超配解决迁移报错,没有评估业务内存峰值风险;
- HA 集群环境,排查只看 PVE 迁移报错,忘记 HA 资源管理器同样做资源预算。
- 点赞
- 收藏
- 关注作者
评论(0)