磁盘故障往往先表现为接口尾延迟升高,CPU 使用率却不高。iowait 只能说明 CPU 在等待 I/O,不能直接指出哪个设备或进程有问题。
从设备层开始
iostat -xz 1
lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS
重点关注 await、aqu-sz 和 %util。await 持续升高说明请求响应慢;队列长度增长说明请求堆积;云盘即使 %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。