blktrace 是什么
blktrace 采集块层的完整事件流:一个请求从进入队列(Q)、被合并或插入调度器(G/I)、下发到设备驱动(D)到最终完成(C)的每个阶段都带时间戳,因此可以精确回答「慢在排队还是慢在设备」。blkparse 负责把二进制流解析成可读文本,btt 则把总延迟分解成各阶段分量(如 Q 到 C 的时间分布),用于定位延迟来源。
基本信息
| 采集 | blktrace -d /dev/sdb -o /tmp/trace |
|---|---|
| 解析 | blkparse -i /tmp/trace |
| 延迟分解 | btt -i /tmp/trace -o /tmp/trace.btt |
| 权限要求 | root |
| 数据量 | 极大,几秒就能产生大量文件,需限定窗口 |
| 覆盖范围 | 块设备层;文件系统与页缓存层面的问题需其他工具 |
典型使用场景
- 应用报告写延迟高,需要判断是否卡在块层
- 区分排队延迟与设备处理延迟:这是队列深度与设备能力的判断依据
- 验证调度器或队列参数调整前后的实际延迟变化
- 定位某块盘上偶发的慢请求,取得可复核的追踪证据
- 为存储或云平台侧提供延迟分解数据,支撑协同排查
采集与解析
采集与解析
sudo blktrace -d /dev/sdb -o /tmp/trace # 开始采集,Ctrl-C 结束
# 期间运行代表性负载,把采集窗口控制在 10 秒左右
ls -lh /tmp/trace* # 数据按 CPU 分片,先确认规模再解析
sudo blkparse -i /tmp/trace > /tmp/trace.txt # 解析为文本并保存
grep -c . /tmp/trace.txt # 统计事件行数,判断采集量
grep -m5 ' Q ' /tmp/trace.txt # 观察请求进入队列的事件
grep -m5 ' D ' /tmp/trace.txt # 观察请求下发到驱动的时刻
sudo btt -i /tmp/trace -o /tmp/trace.btt # 生成延迟分解结果
ls -R /tmp/trace.btt | head # 查看分解输出的文件结构事件标记读法
| 标记 | 阶段 | 含义 |
|---|---|---|
| Q | 进入队列 | 请求首次进入块层的时刻 |
| G | 合并 | 请求被合并进已有请求 |
| I | 插入 | 请求被放入调度器队列 |
| D | 下发 | 请求交给设备驱动处理 |
| C | 完成 | 设备返回完成状态 |
采集数据量非常大,建议限定单一设备并把窗口控制在十秒量级;解析前先看文件大小,否则后续分析会被海量事件拖慢。
blktrace 只看块层,不包含文件系统元数据操作与页缓存命中的细节。如果问题发生在文件系统层(例如目录遍历、锁竞争),需要配合其他工具一起分析。