PVE 踩坑笔记:在线迁移提示目标节点内存不足,Web 显示目标节点还有大量空闲内存

举报
Auunes 发表于 2026/10/28 09:56:01 2026/10/28
【摘要】 一、故障表现集群状态正常,节点之间网络、存储满足在线迁移条件Web 监控面板目标节点内存还有大量剩余,swap 使用率很低发起在线迁移直接提示内存不足,拒绝开始迁移关闭其他虚拟机释放内存后,有可能迁移成功;也有可能释放一部分依旧报错虚拟机开启内存气球(balloon),虚拟机内实际占用内存远小于配置内存宿主机 free 命令看空闲内存充足,和 PVE 迁移校验结果不一致典型特征:操作系统层面...

一、故障表现

  • 集群状态正常,节点之间网络、存储满足在线迁移条件
  • Web 监控面板目标节点内存还有大量剩余,swap 使用率很低
  • 发起在线迁移直接提示内存不足,拒绝开始迁移
  • 关闭其他虚拟机释放内存后,有可能迁移成功;也有可能释放一部分依旧报错
  • 虚拟机开启内存气球(balloon),虚拟机内实际占用内存远小于配置内存
  • 宿主机 free 命令看空闲内存充足,和 PVE 迁移校验结果不一致

典型特征:操作系统层面内存充足,但 PVE 的迁移预检查算法判定内存不够,属于统计口径差异带来的经典迁移坑。

二、原理简单说明

PVE 做在线迁移预校验时,默认按虚拟机配置的最大内存(memory)来评估需要的资源,而不是虚拟机当前实际占用内存。 哪怕开启了 balloon 内存气球,虚拟机现在只用了 4G,但是 VM 设置内存是 16G,迁移校验依旧按 16G 去预留。 计算逻辑大致: 目标节点可用 = 节点总内存 - 所有 VM 配置内存总和 - 宿主机系统预留内存 而 Web 页面、free 命令显示的是实时已经消耗的内存(balloon 压缩后实际占用)。 两者统计口径完全不同,就出现 “看着内存很多,不让迁移”。 另外还有一个因素:在线迁移需要额外内存缓存用于迁移过程的内存页拷贝,也会占用预留额度。

三、排查顺序

  1. 查看目标节点所有虚拟机配置内存总和
# 在目标节点统计所有VM的设定内存
qm list | awk '{print $3}' | grep -E '^[0-9]+$' | awk '{sum+=$1} END{print sum/1024 " GB"}'

这个是 PVE 校验用的总申请内存,不是实时占用。

  1. 查看节点总内存
free -h
  1. 查看当前虚拟机内存配置,确认是否开启 balloon
qm config 100

查看 memory、balloon 参数。balloon=0 代表关闭气球,balloon=1 开启。

  1. 查看节点宿主机预留内存设置
cat /etc/pve/nodes/<节点名>/config

查找 memory 预留配置。

  1. 查看迁移详细任务日志,确认报错原文

四、分场景修复方案

场景 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:迁移时内存脏页速度太快,迁移缓冲区预估不足

少数情况:节点额度刚好卡线,虚拟机写入内存速度快,迁移需要额外缓冲空间,校验直接判定不足。 处理:降低虚拟机负载,减少内存脏页产生速度之后再迁移。

五、验证修复

调整完成后,重新发起在线迁移,不再报内存不足,迁移流程正常开始拷贝内存页即为修复。

六、高频踩坑点

  1. 拿 free 或者 Web 监控的实时内存占用,去对标 PVE 迁移校验规则,两个不是一套统计标准;
  2. 误以为开启 balloon 就可以自由超配热迁移,忽略热迁移校验取 memory 上限;
  3. 不知道节点内存预留参数,预留吃掉一大块内存额度,一直找不到原因;
  4. 盲目开启内存超配解决迁移报错,没有评估业务内存峰值风险;
  5. HA 集群环境,排查只看 PVE 迁移报错,忘记 HA 资源管理器同样做资源预算。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。