逐条 IO 明细
逐条打印块层 IO 的细节:发起进程、读写方向、扇区与完成延迟,用来把慢 IO 点名到具体进程和具体位置。它给出的是个体样本而不是统计分布,所以通常先用分布工具看整体形态、锁定时间窗口,再用它做定点观察。
基本信息
| 适用平台 | Linux,需要内核 eBPF 支持与较高权限 |
|---|---|
| 输出内容 | 时间、进程、读写方向、扇区与延迟 |
| 常用参数 | 是否包含排队时间 |
| 输出量 | 与 IO 频率成正比,高负载下非常大 |
| 使用建议 | 先分布后明细,缩短观察窗口 |
典型使用场景
- 把慢 IO 归因到具体服务或进程。
- 结合扇区偏移判断是否存在热点区段。
- 验证缓存、限流与预读策略调整的效果。
- 排查单次异常慢 IO,确认是设备抖动还是上层重试。
- 多个进程争抢存储时,对照各自的实际 IO 情况。
用法
用法
biosnoop-bpfcc | head -40 # 先看前若干条,判断量级
biosnoop-bpfcc -Q | head # 包含系统排队时间
biosnoop-bpfcc -d sda | head -20 # 只看指定设备
lsblk -d -o NAME,ROTA,SCHED # 确认设备名、是否机械盘与调度器
timeout 20 biosnoop-bpfcc > /tmp/io.log # 限时采集并留档到文件
awk '{print $NF, $0}' /tmp/io.log | sort -g | tail -20 # 按延迟列排序,找最慢的几条字段判读
| 字段 | 含义 | 判读要点 |
|---|---|---|
| 时间 | IO 完成时刻 | 与业务慢的时刻对齐 |
| 进程与进程号 | 发起 IO 的对象 | 归因到具体服务 |
| 读写类型 | 方向 | 区分读放大与写放大 |
| 扇区与长度 | 设备上的位置与大小 | 结合偏移找热点区段 |
| 延迟 | 单次 IO 的耗时 | 结合队列深度判断 |
| 同进程多条聚集 | 同一进程连续发起 IO | 常见于顺序扫描或批量写入 |
先看分布再看明细的效率远高于直接盯明细:高 IOPS 环境里逐条输出会持续刷屏,先确定时间窗口和可疑设备能省下大量时间。
长时间全量采集会同时拖慢排查与占用磁盘,日志文件也可能迅速变大;限制采集时长并在采集后立即停止工具。