blktrace 块层跟踪

采集块设备事件流(Q/G/I/D 等阶段),blkparse 可读输出;配合 btt 分解 Q2C 延迟定位慢在排队还是设备。

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 只看块层,不包含文件系统元数据操作与页缓存命中的细节。如果问题发生在文件系统层(例如目录遍历、锁竞争),需要配合其他工具一起分析。

易错点

  • 不限设备与时长直接采集:数据量爆炸,解析和存储都成负担
  • 把它当成文件级追踪工具:只覆盖块层,文件系统与缓存层的问题看不到
  • 在生产设备上长时间采集:有轻微开销,应避开峰值或先在测试环境验证
  • 误读事件顺序:合并与插入阶段的含义需对照文档,凭直觉解读容易得出错误结论
  • 在虚拟化或网络存储上期待完整阶段:驱动侧事件可能不完整,解读时要说明环境

数据来源与参考

  • blktrace 官方文档(blktrace(8)/blkparse(1))
  • Linux 内核 Documentation/block/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌