磁盘 I/O 延迟排查:从 iowait 找到慢设备

使用 iostat、pidstat 和块设备信息定位磁盘延迟,区分吞吐饱和、队列堆积与文件系统问题。

文章目录 · 4 节

磁盘故障往往先表现为接口尾延迟升高,CPU 使用率却不高。iowait 只能说明 CPU 在等待 I/O,不能直接指出哪个设备或进程有问题。

从设备层开始

iostat -xz 1
lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS

重点关注 awaitaqu-sz%utilawait 持续升高说明请求响应慢;队列长度增长说明请求堆积;云盘即使 %util 不满,也可能触发 IOPS 或吞吐配额。

定位进程和文件

pidstat -d 1
sudo iotop -oPa
sudo lsof +L1

lsof +L1 可以找到已删除但仍被进程占用的文件,这类文件会让磁盘空间无法释放。数据库场景还要检查后台合并、检查点和日志刷盘是否与业务峰值重叠。

识别错误与降级

journalctl -k | grep -iE 'error|timeout|reset|nvme|scsi'
df -hT
df -i

inode 耗尽、文件系统只读和设备 reset 都可能表现为应用超时。发现硬件错误时应先迁移负载,不要在故障盘上反复压测。

优化前提

明确瓶颈是随机 IOPS、顺序吞吐还是同步写延迟,再选择批量写、缓存、分层存储或扩容。任何优化都要用相同负载复测 await 与业务 P99。