PVE 踩坑笔记:虚拟机磁盘 IO 高,宿主机负载飙升但 VM 内找不到进程

举报
Auunes 发表于 2026/10/16 09:22:05 2026/10/16
【摘要】 一、故障表现PVE 节点监控:iowait 持续很高,磁盘读写带宽 / IOPS 跑满,宿主机负载飙升受影响虚拟机业务响应缓慢,卡顿、超时进入虚拟机内部排查:Linux:top、iotop 看不到高 IO 进程Windows:任务管理器磁盘面板,没有进程占用大量读写重启虚拟机短暂恢复,一段时间后故障复现同节点其他虚拟机不受影响,说明不是整块存储硬件故障现象特征:IO 压力在宿主机可见,但虚拟...

一、故障表现

  • PVE 节点监控:iowait 持续很高,磁盘读写带宽 / IOPS 跑满,宿主机负载飙升
  • 受影响虚拟机业务响应缓慢,卡顿、超时
  • 进入虚拟机内部排查:
    • Linux:top、iotop 看不到高 IO 进程
    • Windows:任务管理器磁盘面板,没有进程占用大量读写
  • 重启虚拟机短暂恢复,一段时间后故障复现
  • 同节点其他虚拟机不受影响,说明不是整块存储硬件故障

现象特征:IO 压力在宿主机可见,但虚拟机内部看不到对应的 IO 占用进程,属于 PVE 虚拟化典型疑难 IO 问题。

二、原理简单说明

QEMU 虚拟机磁盘 IO 是宿主机与客户机两层统计。 客户机(VM)操作系统只能看到客户机内部发起的 IO 请求。 而宿主机看到的 IO,除了客户机业务 IO,还包含:宿主机快照、备份、垃圾回收、精简盘空洞释放、存储层校验、QEMU 缓存、块设备后台操作。 这些后台操作产生的 IO,不会体现在虚拟机内部的进程统计中,这就是为什么 VM 里找不到占用 IO 的进程。

三、排查顺序

  1. 宿主机层面,先确认是哪块磁盘 / 存储在产生 IO 压力
# 宿主机查看磁盘IO
iostat -x 1
# 查看进程IO
iotop -oP

找到高 IO 对应的进程,大概率是qemu-kvm,记下 PID,再定位是哪台虚拟机。

  1. 根据 qemu 进程 PID,找到对应的 VM ID
ps aux | grep qemu-kvm | grep PID号

命令输出里可以看到 vm-xxx-disk-x 这类磁盘标识,确认虚拟机 ID。

  1. 确认 IO 来源:是客户机业务 IO,还是宿主机侧任务(备份 / 快照 / GC)
# 查看PVE正在运行的任务
pvesh create /nodes/你的节点名/tasks
# 查看当前备份任务
cat /var/log/pbs/backup.log
# 查看LVM thin GC垃圾回收状态(如果用LVM-Thin)
lvs
thin_check /dev/pve/你的thinpool
  1. 进入虚拟机内部做对比验证
# Linux虚拟机内安装iotop
apt install iotop
iotop -o

对比宿主机 iotop 和 VM 内 iotop 的 IO 流量差异。 宿主机 IO >> VM 内统计 IO,基本判定是宿主机 / 存储后台操作。

四、分场景修复方案

场景 1:LVM-Thin 存储垃圾回收 GC(高频元凶)

LVM-Thin 精简磁盘,删除文件后不会立刻释放空间,后台 GC 回收空洞时会产生大量随机 IO。这部分 IO 是宿主机块设备层操作,虚拟机内完全看不到。

临时排查:

# 查看thinpool状态,看是否正在GC
thin_dump /dev/pve/thinpool | grep "current_transaction"

处理方案:

  1. 错开业务高峰,调整 GC 自动执行时间;
  2. 手动执行fstrim在虚拟机内释放空洞,减少 GC 压力;

Linux 虚拟机:

fstrim -av

Windows 虚拟机:开启系统磁盘优化(TRIM)。 3. 生产环境:评估是否把关键业务改用厚置磁盘,减少 GC 带来的突发 IO 抖动。

场景 2:PVE 备份 / PBS 备份任务

PVE 或者 Proxmox Backup Server 做虚拟机备份,备份读取整块磁盘数据,会产生大量读 IO。 备份进程在宿主机,VM 内部进程列表不会统计备份产生的磁盘读取。

修复:

  1. 调整备份计划,避开业务高峰;
  2. 开启备份限流,PBS 任务中设置带宽 / IO 限制;
  3. 确认快照机制:备份时创建临时快照,快照合并阶段也会产生大量 IO。快照提交合并 IO 同样在宿主机侧。

场景 3:虚拟机磁盘使用精简盘 + 频繁随机写

精简盘(Sparse),新写入块时需要宿主机分配空间,分配动作带来额外 IO 开销。 客户机写数据,但是空间分配开销发生在宿主机存储层,VM 内只能看到业务写,看不到分配开销。

临时验证:克隆虚拟机,使用厚置磁盘测试,观察 iowait 是否下降。

场景 4:QEMU 缓存模式配置不合理

磁盘缓存设置:None / Writeback / Writethrough,不同缓存模式 IO 行为差异巨大。

  • writethrough:强一致性,性能差,IO 放大明显;
  • writeback:性能好,断电丢数据风险;
  • none:直通,IO 统计更贴近客户机真实业务。

操作:关闭虚拟机,修改磁盘缓存选项,调整后测试。 业务数据库优先推荐 none。

场景 5:存储硬件 / RAID 卡问题

RAID 卡后台校验、重建、电池充放电,也会占用大量 IO,宿主机 iowait 上涨,和虚拟机无关。 查看 RAID 卡日志,确认阵列状态。

五、验证修复

调整完成后持续观察宿主机:

iostat -x 5

iowait 回落,业务不再卡顿。同时对比宿主机与虚拟机内 IO 统计,两边数值趋于一致即为正常。

六、高频踩坑点

  1. 只在虚拟机内部查 IO,忽略宿主机和存储后台任务,白白浪费大量排查时间。
  2. 精简盘没有开启 TRIM,空洞持续堆积,GC 一跑就打满 IO。
  3. 备份任务没有限流,高峰期全节点 IO 被备份抢占。
  4. 混淆 “客户机 IO 统计” 和 “宿主机块设备 IO 统计”,虚拟化环境两者不一定相等。
  5. LVM-Thin GC 默认自动执行,很多运维不知道这个后台任务,遇到故障第一时间想不到。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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