iostat -x 输出中反映扇区级读写延迟的是 r_await 和 w_await 列,单位毫秒,表示内核发出请求至设备完成中断的全程耗时,不包含文件系统或 page cache 延迟。

Linux怎么查看扇区读写延迟造成的超时

iostat -x 输出里哪几列对应扇区级读写延迟

扇区读写延迟和应用层超时可不一样,但它可是底层超时的直接导火索。在iostat -x 1中,真正能反映扇区I/O延迟的是r_awaitw_await——它们的单位是毫秒,统计的是从内核发出请求(包括扇区寻址、DMA准备)到设备返回完成中断这一整个过程所花费的时间,而不是文件系统或page cache层面的延迟。

注意:await 是读写混合平均值,掩盖了读/写路径差异;svctm 已被内核弃用(2.6.38+),数值不可信;%util 在 NVMe 上基本失效,不能用来反推扇区延迟。

ioping -C 直打设备测扇区真实响应时间

想绕过所有缓存和文件系统,只测裸设备扇区读写延迟,必须用 ioping-C 参数。它发的是同步 I/O 请求,强制落盘,返回的就是控制器+介质的真实扇区往返时间。

别用默认模式:不加 -Cioping /dev/sda 测的是缓存命中路径,数值虚低;dd 更不行,它只测顺序吞吐,完全不模拟随机扇区访问。

查 /proc/diskstats 看扇区超时是否触发重试

内核遇到扇区读写超时(如 SCSI timeout、NVMe command timeout),会记录重试次数和失败扇区号,这些信息不出现在 iostat 里,得直接扒 /proc/diskstats

字段顺序是固定的哦,第1列是主设备号,第2列是次设备号,第3列是设备名,第4到11列呢,则是读写统计。这里面关键要关注第10列,也就是“当前正在处理的I/O数”,还有第11列“ I/O处理总耗时,毫秒”。要是第11列的增长速度远远快于第4到7列(r/s、w/s),那就说明大量的请求卡在扇区层没返回,很可能已经超时重试啦。

fio 测扇区长尾延迟,定位偶发超时根源

日常监控看到的 r_await 是平均值,掩盖了 p99.9 超时事件。一次 500ms 的扇区超时,在 1000 次请求里只拉高平均值 0.5ms,但足以让数据库事务超时。必须用 fio 打百分位分布。

配置要点:必须 direct=1(绕 page cache)、ioengine=libaio(用异步 I/O)、iodepth=32(模拟真实并发),否则测出来全是缓存速度。

扇区超时不是孤立指标,它总是和调度器、队列深度、硬件健康状态耦合。盯住 r_awaitioping -C 的 a vg,再用 fio 扫长尾,最后用 dmesg/proc/diskstats 锁定是否真发生超时 —— 这四步缺一不可。

本文转载于:https://www.php.cn/faq/3024443.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。