PVE 踩坑笔记:虚拟机磁盘 IO 高,宿主机负载飙升但 VM 内找不到进程
一、故障表现
- PVE 节点监控:iowait 持续很高,磁盘读写带宽 / IOPS 跑满,宿主机负载飙升
- 受影响虚拟机业务响应缓慢,卡顿、超时
- 进入虚拟机内部排查:
- Linux:
top、iotop看不到高 IO 进程 - Windows:任务管理器磁盘面板,没有进程占用大量读写
- Linux:
- 重启虚拟机短暂恢复,一段时间后故障复现
- 同节点其他虚拟机不受影响,说明不是整块存储硬件故障
现象特征:IO 压力在宿主机可见,但虚拟机内部看不到对应的 IO 占用进程,属于 PVE 虚拟化典型疑难 IO 问题。
二、原理简单说明
QEMU 虚拟机磁盘 IO 是宿主机与客户机两层统计。 客户机(VM)操作系统只能看到客户机内部发起的 IO 请求。 而宿主机看到的 IO,除了客户机业务 IO,还包含:宿主机快照、备份、垃圾回收、精简盘空洞释放、存储层校验、QEMU 缓存、块设备后台操作。 这些后台操作产生的 IO,不会体现在虚拟机内部的进程统计中,这就是为什么 VM 里找不到占用 IO 的进程。
三、排查顺序
- 宿主机层面,先确认是哪块磁盘 / 存储在产生 IO 压力
# 宿主机查看磁盘IO
iostat -x 1
# 查看进程IO
iotop -oP
找到高 IO 对应的进程,大概率是qemu-kvm,记下 PID,再定位是哪台虚拟机。
- 根据 qemu 进程 PID,找到对应的 VM ID
ps aux | grep qemu-kvm | grep PID号
命令输出里可以看到 vm-xxx-disk-x 这类磁盘标识,确认虚拟机 ID。
- 确认 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
- 进入虚拟机内部做对比验证
# 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"
处理方案:
- 错开业务高峰,调整 GC 自动执行时间;
- 手动执行
fstrim在虚拟机内释放空洞,减少 GC 压力;
Linux 虚拟机:
fstrim -av
Windows 虚拟机:开启系统磁盘优化(TRIM)。 3. 生产环境:评估是否把关键业务改用厚置磁盘,减少 GC 带来的突发 IO 抖动。
场景 2:PVE 备份 / PBS 备份任务
PVE 或者 Proxmox Backup Server 做虚拟机备份,备份读取整块磁盘数据,会产生大量读 IO。 备份进程在宿主机,VM 内部进程列表不会统计备份产生的磁盘读取。
修复:
- 调整备份计划,避开业务高峰;
- 开启备份限流,PBS 任务中设置带宽 / IO 限制;
- 确认快照机制:备份时创建临时快照,快照合并阶段也会产生大量 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 统计,两边数值趋于一致即为正常。
六、高频踩坑点
- 只在虚拟机内部查 IO,忽略宿主机和存储后台任务,白白浪费大量排查时间。
- 精简盘没有开启 TRIM,空洞持续堆积,GC 一跑就打满 IO。
- 备份任务没有限流,高峰期全节点 IO 被备份抢占。
- 混淆 “客户机 IO 统计” 和 “宿主机块设备 IO 统计”,虚拟化环境两者不一定相等。
- LVM-Thin GC 默认自动执行,很多运维不知道这个后台任务,遇到故障第一时间想不到。
- 点赞
- 收藏
- 关注作者
评论(0)