为什么在系统负载很重的情况下进程会被 I/O 阻塞?

Mar*_*tin 5 io iotop

我有一个工作站(2 个 Intel Xeon 系列 CPU 和 128GiB 的 RAM)运行多个虚拟机,虽然组合 CPU 使用率 <30%,但平均负载在 20 到 25 之间。例如,如果我执行一个tar -xzvf vm_data.tgz --directory vm4/ --strip-components=1命令,那么该gzip过程是90% -其99%的时间已被I / O和命令需要永远完成:

在此处输入图片说明

另一方面,与 SATA 3.0 或 SSD(我使用的是单个金士顿 SA400S37960G SSD)硬件限制相比,对磁盘的实际读取和写入非常低。

什么可能导致进程(gzip在我的示例中)在 I/O 之后等待而实际磁盘读取和写入似乎非常低?我的第一个想法是,也许系统中断非常高,这就是阻塞 I/O 的原因,但根据/proc/interrupts这一点,情况似乎并非如此,因为没有一个计数器在快速增加。

Art*_*nov 3

许多年前,我的生产 MySQL 数据库遇到了非常类似的问题。事实证明,它的文件非常碎片化,备份它们会导致所有其他磁盘操作永远无法完成。

请发布以下输出:

find vm4 -type f | while read filename; do sudo filefrag "$filename" | egrep -v ": 1 extent|: 0 extents"; done | sort
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,如果我的猜测是正确的,您需要对虚拟机文件进行碎片整理。