资讯动态

blktrace介绍和使用指南。

发布时间:2026/8/4 20:06:13 来源:尧图企业网站定制
1.blktrace是什么blktrace是 Linux 下用于跟踪block layer I/O 行为的工具。它可以记录一个块设备上的 I/O 从进入 block layer 到完成之间的各种事件例如I/O 何时进入队列是否发生 merge何时下发到 driver/device何时完成I/O 类型是 read、write、flush、discardsector、大小、进程名、PID、CPU 等信息常用于场景用途SSD 性能分析观察真实 I/O pattern、队列行为、latencyfio workload 验证确认 fio 是否按预期下发 I/O延迟尖峰分析定位 block layer 哪个阶段耗时I/O merge 分析查看随机/顺序 I/O 是否被合并queue depth 分析判断实际是否打满设备kernel / driver 调试分析 request 生命周期2. 常用工具组件blktrace通常和下面几个工具一起使用工具作用blktrace采集 block traceblkparse解析 blktrace 输出bttBlock Trace Toolkit分析延迟、队列、seek 等iowatcher生成 I/O 可视化图表部分系统可能没有安装安装方式通常是sudoaptinstallblktrace或sudoyuminstallblktrace3. 基本使用流程3.1 采集 3 秒 trace推荐使用完整设备路径sudoblktrace-w3-d/dev/nvme0n1参数说明参数含义-w 3采集 3 秒-d /dev/nvme0n1指定被跟踪的 block device执行后会在当前目录生成多个文件例如nvme0n1.blktrace.0 nvme0n1.blktrace.1 nvme0n1.blktrace.2 ...这些是 per-CPU trace 文件。3.2 解析 traceblkparse-invme0n1这里的nvme0n1是输入文件前缀blkparse会自动读取nvme0n1.blktrace.*3.3 保存解析结果blkparse-invme0n1|teeblkparse_nvme0n1.log如果还想生成 binary dump用于后续btt分析blkparse-invme0n1-dblkparse_nvme0n1.bin|teeblkparse_nvme0n1.log注意-dblkparse_nvme0n1.bin这里的-d是让blkparse输出一个二进制 dump 文件不是指定 device。4. 推荐标准命令你的场景可以写成这样sudoblktrace-w3-d/dev/nvme0n1-onvme0n1sudoblkparse-invme0n1\-d../blkparse_nvme0n1.bin\|tee-a../blkparse_nvme0n1.log说明命令说明-o nvme0n1指定输出文件前缀blkparse -i nvme0n1读取nvme0n1.blktrace.*-d ../blkparse_nvme0n1.bin生成二进制 trace dumptee -a追加保存文本 log5. 脚本化使用示例建议每次采集放到独立目录避免旧文件混淆。#!/bin/bashdevnvme0n1duration3outdir../blktrace_${dev}_$(date%Y%m%d_%H%M%S)mkdir-p$outdirechoCollecting blktrace for /dev/$dev, duration${duration}ssudoblktrace-w$duration-d/dev/$dev-o$outdir/$devechoParsing trace...sudoblkparse-i$outdir/$dev\-d$outdir/blkparse_${dev}.bin\|tee$outdir/blkparse_${dev}.logechoDone. Output directory:$outdir运行bashrun_blktrace.sh输出类似../blktrace_nvme0n1_20260804_093000/ ├── nvme0n1.blktrace.0 ├── nvme0n1.blktrace.1 ├── nvme0n1.blktrace.2 ├── blkparse_nvme0n1.bin └── blkparse_nvme0n1.log6. 实时解析模式如果不想保存中间 trace 文件可以直接sudoblktrace-d/dev/nvme0n1-o-|blkparse-i-采集指定时间sudoblktrace-w3-d/dev/nvme0n1-o-|blkparse-i-保存 logsudoblktrace-w3-d/dev/nvme0n1-o-\|blkparse-i-\|teeblkparse_nvme0n1.log这种方式适合快速看结果但如果后续要用btt分析建议保存 binary dump。7.blkparse输出怎么看典型输出类似8,0 0 1 0.000000000 1234 Q WS 123456 8 [fio] 8,0 0 2 0.000001234 1234 G WS 123456 8 [fio] 8,0 0 3 0.000002345 1234 I WS 123456 8 [fio] 8,0 0 4 0.000003456 1234 D WS 123456 8 [fio] 8,0 0 5 0.000123456 1234 C WS 123456 8 [0]字段大致含义字段示例含义device8,0major, minorCPU0事件发生的 CPUsequence1事件序号timestamp0.000000000时间戳单位秒PID1234进程 IDactionQ/G/I/D/Cblock eventRWBSWSI/O 类型sector123456起始 sectorsize 8sector 数量process[fio]进程名8. 常见 action 含义blkparse中最重要的是 action 字段。Action含义说明QQueueI/O 进入 block layerGGet request分配 requestIInsert插入 I/O scheduler / request queueDIssue / Dispatch下发到 driver/deviceCCompleteI/O 完成MBack merge和前面的 request 合并FFront merge和后面的 request 合并BBouncedbounce bufferARemapI/O 被 remapXSplitI/O 被拆分通常分析 latency 时最关注Q - D - C或者更细Q - G - I - D - C9. RWBS 字段怎么看RWBS 表示 I/O 类型和属性。常见值RWBS含义RReadWWriteDDiscard / TRIMFFlushAReadaheadSSyncMMetadataNFUA / Force Unit Access取决于内核版本显示例如WS一般表示WriteSyncRA表示ReadReadahead10. 用btt分析延迟如果你生成了 binary dumpblkparse-invme0n1-dblkparse_nvme0n1.bin可以用btt-iblkparse_nvme0n1.bin-obtt_nvme0n1它会生成一组文件例如btt_nvme0n1.avg btt_nvme0n1.dat btt_nvme0n1.q2c btt_nvme0n1.d2c ...常见 latency 缩写缩写含义Q2QQueue to QueueQ2GQueue to Get requestG2IGet request to InsertI2DInsert to DispatchD2CDispatch to CompleteQ2CQueue to Complete总 block layer 视角延迟对 SSD 性能分析来说比较常看指标说明Q2C应用到 block complete 的整体延迟D2Crequest 下发到设备后到完成的时间I2D在 scheduler / queue 中等待的时间queue depth是否真的把设备压满11. 常用场景示例11.1 验证 fio I/O size先运行 fio例如fio--namerandread\--filename/dev/nvme0n1\--direct1\--rwrandread\--bs4k\--iodepth32\--numjobs1\--runtime30\--time_based1\--ioenginelibaio同时采集sudoblktrace-w5-d/dev/nvme0n1-onvme0n1 blkparse-invme0n1|teeblkparse.log看输出中类似R 123456 8因为一个 sector 通常是 512 bytes8 sectors * 512 bytes 4096 bytes 4 KiB所以 8对应 4 KiB I/O。11.2 查看 read/write 数量grep R blkparse_nvme0n1.log|wc-lgrep W blkparse_nvme0n1.log|wc-l不过更准确时建议筛选 Complete 事件grep C blkparse_nvme0n1.log|grep R |wc-lgrep C blkparse_nvme0n1.log|grep W |wc-l11.3 查看是否有 mergegrep M blkparse_nvme0n1.loggrep F blkparse_nvme0n1.log如果大量顺序 I/O 被合并可能看到很多M或F事件。11.4 查看 flushgrep Fblkparse_nvme0n1.log也可以看 RWBS 字段是否有 flush 相关标记。11.5 分析 tail latency先生成 btt 输出btt-iblkparse_nvme0n1.bin-obtt_nvme0n1然后查看q2c或d2c相关文件。也可以从blkparse文本中自己解析Q和C对应 request 的时间差不过这需要根据 sector、sequence、request 生命周期做匹配建议优先使用btt。12. 过滤指定事件blktrace支持-a指定 action mask。例如只采集 read/writesudoblktrace-w3-d/dev/nvme0n1-aread-awrite-onvme0n1常见可用类别包括read write barrier sync queue requeue issue complete fs pc notify drv_data不同内核版本支持项可能略有差异可以查看manblktrace13. 注意事项和常见坑13.1 设备名建议使用完整路径不推荐blktrace-dnvme0n1推荐sudoblktrace-d/dev/nvme0n113.2 需要 root 权限通常需要sudoblktrace...否则可能报权限错误。13.3 会生成多个 per-CPU 文件例如nvme0n1.blktrace.0 nvme0n1.blktrace.1 ...不要只拷贝其中一个文件否则解析不完整。13.4 多次运行容易混淆旧文件建议每次采集前清理rm-fnvme0n1.blktrace.*或者使用独立目录mkdirtrace_$(date%Y%m%d_%H%M%S)13.5 blktrace 看到的是 block layer不是 NVMe protocol traceblktrace可以告诉你block I/O 什么时间下发sector/size 是什么什么时候完成block layer 是否 merge/split但它不能直接告诉你NVMe command DW 字段SQ/CQ doorbell 细节controller 内部 firmware 行为NAND 层 latency如果要看 NVMe command level可能需要ftrace / trace-cmd 的 nvme tracepointsperfkernel dynamic debugPCIe analyzerfirmware internal trace13.6 NVMe 多队列下事件分布在多个 CPUNVMe 是 blk-mq 多队列模型I/O 可能分布在多个 CPU trace 文件里。解析时一定用blkparse-invme0n1不要只分析单个nvme0n1.blktrace.014. 一个完整例子fio blktrace bttdevnvme0n1outdirblktrace_${dev}_$(date%Y%m%d_%H%M%S)mkdir-p$outdir# 后台采集 10 秒sudoblktrace-w10-d/dev/$dev-o$outdir/$dev# 等待 blktrace 准备sleep1# 跑 fio workloadsudofio--nametest\--filename/dev/$dev\--direct1\--rwrandread\--bs4k\--iodepth32\--numjobs1\--runtime8\--time_based1\--ioenginelibaio\--group_reportingwait# 解析sudoblkparse-i$outdir/$dev\-d$outdir/blkparse_${dev}.bin\|tee$outdir/blkparse_${dev}.log# btt 分析btt-i$outdir/blkparse_${dev}.bin-o$outdir/btt_${dev}echoOutput:$outdir15. 简单结论如果只是快速采集和解析可以用sudoblktrace-w3-d/dev/nvme0n1-onvme0n1sudoblkparse-invme0n1\-dblkparse_nvme0n1.bin\|teeblkparse_nvme0n1.log如果要做 SSD 性能/延迟分析建议再加btt-iblkparse_nvme0n1.bin-obtt_nvme0n1重点关注Q - C整体 I/O 延迟D - C设备/driver 完成延迟I/O size例如8sectors 4 KiBmerge/split是否改变了 workload patternqueue depth是否真正压到 SSD 上了

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价