iostat不能直接检测坏道,但能暴露坏道引发的IO异常特征:w_await持续远超阈值(机械盘>50ms、SSD>10ms)且波动剧烈,%util高但wkB/s极低或归零,avgqu-sz显著升高而w/s偏低,r_await与w_await同步飙升且svctm接近await。

iostat 本身不能直接检测磁盘坏道,但它能敏锐反映出坏道引发的典型 IO 异常特征——比如写入延迟骤增、请求堆积、利用率虚高但吞吐低下。排查的关键是:把 iostat 当作“症状观察仪”,结合其他工具交叉验证是否指向物理介质故障。
看哪些指标异常,才值得怀疑坏道
坏道(尤其是不可修复的硬错误)会让磁盘在底层反复重试、超时、降速,iostat 会暴露这些“挣扎痕迹”:
-
w_await 持续远高于正常值
- 机械盘 > 50ms、SSD > 10ms 且波动剧烈(不是稳定高,而是忽高忽低、跳变明显)
- 注意区分:单纯负载高时 await 可能升高但较平稳;坏道导致的 await 往往伴随尖峰抖动
-
%util 高但 wkB/s 极低或不稳定
- 例如 %util 95%,但 wkB/s 只有几 MB/s,甚至频繁归零 → 磁盘卡在重试/纠错,实际写不进去
-
avgqu-sz 显著升高 + w/s 却不高
- 队列里堆了大量请求(如 avgqu-sz > 5),但每秒完成的写请求(w/s)却只有个位数 → 请求“堵死”在驱动层,很可能是底层响应失败
-
r_await 和 w_await 同时飙升,且 svctm 接近或超过 await
- 虽然 svctm 在新版内核中已弃用,但如果它和 await 差值极小(比如 svctm=48ms, await=52ms),说明几乎没排队时间,延迟全花在设备处理上 → 设备自身响应慢,非队列问题
✅ 实用命令:
iostat -xmd 1(每秒刷新,MB 单位,扩展指标)
关注 sda(或对应盘符)这一行,连续观察 30 秒以上,不要只看单次采样。
发现可疑后,下一步必须做的三件事
iostat 提示“可能坏了”,但不能下结论。要快速验证是否真为坏道,需立刻执行:
-
检查系统日志是否有硬件级报错
dmesg | grep -i "ata\|nvme\|sd.\|error\|failed\|timeout\|uncorrect"
- 出现
UNCORRECT,ABRT,timeout,retrying,media error,SMART failure等关键词,基本坐实坏道或盘故障 - 特别注意
end_request: I/O error或sector后跟具体扇区号(如sector 123456789)
- 出现
-
运行 SMART 自检(对 HDD/SSD 都适用)
sudo smartctl -a /dev/sda # 查看完整健康状态 sudo smartctl -t short /dev/sda # 快速自检(几分钟) sudo smartctl -t long /dev/sda # 全盘扫描(数小时,生产环境慎用)
- 重点关注
Reallocated_Sector_Ct,Current_Pending_Sector,UDMA_CRC_Error_Count,Media_Wearout_Indicator(SSD)等属性值是否非零或正在增长 -
smartctl -l selftest /dev/sda查看最近一次自检结果
- 重点关注
-
用 dd + direct 方式做扇区级读写验证(谨慎操作)
若日志或 SMART 已提示某区域异常,可定位测试:# 假设 dmesg 提到 sector 123456789,换算成 512 字节偏移:123456789 × 512 sudo dd if=/dev/sda of=/dev/null bs=512 skip=123456789 count=1 iflag=direct
- 如果卡住、报
Input/output error或耗时极长(>30s),基本确认该扇区失效
- 如果卡住、报
坏道引发的 IO 飙升 vs 其他原因的区别点
| 现象 | 坏道典型表现 | 其他常见原因(如日志刷盘、DB checkpoint) |
|---|---|---|
| %util | 高但“假忙”:吞吐低、w/s 少、avgqu-sz 高 | 高且真实:wkB/s 高、w/s 高、吞吐匹配 |
| await 曲线 | 抖动剧烈,出现毫秒级尖峰或长时间挂起 | 相对平滑上升/回落,无突兀断点 |
| dmesg 日志 | 大量 ATA/NVMe 底层错误、sector 报告 | 无硬件错误,可能有 jbd2, klogd, rsyslogd 进程日志 |
| SMART 属性 | Reallocated/Pending Sector 数上升 | 所有关键属性正常 |
不复杂但容易忽略:iostat 是起点,不是终点。它告诉你“这里疼”,但得靠 dmesg、SMART 和定向读写,才能看清是肌肉拉伤还是骨头裂了。


















