合 IO追踪神器blktrace使用介绍
- 前言
- blktrace安装
- blktrace的原理
- 一个I/O请求进入block layer之后,可能会经历下面的过程:
- blkparse显示的各指标点示意:
- blktrace 能够记录下IO所经历的各个步骤:
- blktrace的用法
- 实时查看:
- 先采集,再查看:
- blktrace产生的文件太零散怎么办?
- 生成采集文件
- 合并成一个二进制文件
- 其实我们还是嫌弃blkparse的输出太多,不方便查看,此时可以利用btt协助分析统计
- 上述命令其实还会产生一些.dat文件,可以看到iops信息
- 文件解释:
- 修改blkparse的输出格式:
- 一次IO的生命周期:direct read 附录见测试代码
- 一次IO的生命周期:direct write 附录见测试代码
- blktrace -a 参数可以指定监控的动作:
- 其他工具:blkiomon
- 参考
前言
- blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。
- blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。
blktrace安装
1 2 3 4 | yum install -y blktrace blkiomon -- 或 git clone git://git.kernel.dk/blktrace.git |
blktrace的原理
一个I/O请求的处理过程,可以梳理为这样一张简单的图:
一个I/O请求进入block layer之后,可能会经历下面的过程:
- I/O enters block layer – it can be:
- Remapped onto another device (MD, DM)
- Split into 2 separate I/Os (alignment, size, ...)
- Added to the request queue
- Merged with a previous entry on the queue All I/Os end up on a request queue at some point
- At some later time, the I/O is issued to a device driver, and submitted to a device
- Later, the I/O is completed by the device, and its driver
blkparse显示的各指标点示意:
1 2 3 4 5 6 | Q------->G------------>I--------->M------------------->D----------------------------->C |-Q time-|-Insert time-| |--------- merge time ------------|-merge with other IO| |----------------scheduler time time-------------------|---driver,adapter,storagetime--| |----------------------- await time in iostat output ----------------------------------| |
其中:
- Q2Q — time between requests sent to the block layer
- Q2G — time from a block I/O is queued to the time it gets a request allocated for it
- G2I — time from a request is allocated to the time it is Inserted into the device's queue
- Q2M — time from a block I/O is queued to the time it gets merged with an existing request
- I2D — time from a request is inserted into the device's queue to the time it is actually issued to the device
- M2D — time from a block I/O is merged with an exiting request until the request is issued to the device
- D2C — service time of the request by the device
- Q2C — total time spent in the block layer for a request
blktrace 能够记录下IO所经历的各个步骤:
blktrace的输出:
- 第一个字段:8,0 这个字段是设备号 major device ID和minor device ID。
- 第二个字段:3 表示CPU
- 第三个字段:11 序列号
- 第四个字段:0.009507758 Time Stamp是时间偏移
- 第五个字段:PID 本次IO对应的进程ID
- 第六个字段:Event,这个字段非常重要,反映了IO进行到了那一步
- 第七个字段:R表示 Read, W是Write,D表示block,B表示Barrier Operation
- 第八个字段:223490+56,表示的是起始block number 和 number of blocks,即我们常说的Offset 和 Size
- 第九个字段: 进程名
其中第六个字段非常有用:每一个字母都代表了IO请求所经历的某个阶段。
1 2 3 4 5 6 7 8 9 | Q – 即将生成IO请求 | G – IO请求生成 | I – IO请求进入IO Scheduler队列 | D – IO请求进入driver | C – IO请求执行完毕 |
blktrace的用法
实际上blktrace仅仅是用来采集数据,数据的分析其实有很多辅助的工具,比如:
- blkparse
- btt
- blkiomon
- iowatcher
这些工具都是利用blktrace采集的数据,更好的分析,然后输出。
使用blktrace前提需要挂载debugfs。
1 | mount –t debugfs debugfs /sys/kernel/debug |
实时查看:
1 2 3 | blktrace只负责采集,blkparse 负责解析成适合人类看的文字: blktrace -o 指定输出 #blktrace -d /dev/sda -o - | blkparse -i - |
先采集,再查看:
1 2 3 4 | 1. 先采集,将会在当前目录获得一堆的文件,缺省的输出文件名是 sdb.blktrace.<cpu>,每个CPU对应一个文件。 #blktrace /dev/sda /dev/sdb 2. 给blkparse传递磁盘的名字,将会直接解析。 #blkparse sda sdb |
blktrace产生的文件太零散怎么办?
生成采集文件
1 | #blktrace -d /dev/sda |
合并成一个二进制文件
1 | #blkparse -i sda -d sda.blktrace.bin |
其实我们还是嫌弃blkparse的输出太多,不方便查看,此时可以利用btt协助分析统计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #btt -i sda.blktrace.bin -l sda.d2c_latency # 这里就可以看到,每个阶段,消耗的时间 [root@localhost2 /data/sandbox/blktrace_test] #btt -i sda.blktrace.bin -l sda.d2c_latency ==================== All Devices ==================== ALL MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Q 0.000000238 0.126069031 5.007614945 40 Q2G 0.000000556 0.000001765 0.000006022 11 G2I 0.000000528 0.000003506 0.000015113 11 Q2M 0.000000135 0.000000209 0.000001162 30 I2D 0.000000396 0.000001240 0.000003602 11 M2D 0.000002235 0.000007047 0.000014071 30 D2C 0.003104665 0.015828304 0.028136240 41 Q2C 0.003117684 0.015835360 0.028138401 41 # 这里看到整个IO下来,每个阶段所消耗的时间,占用百分比 ==================== Device Overhead ==================== DEV | Q2G G2I Q2M I2D D2C ---------- | --------- --------- --------- --------- --------- ( 8, 0) | 0.0030% 0.0059% 0.0010% 0.0021% 99.9554% ---------- | --------- --------- --------- --------- --------- Overall | 0.0030% 0.0059% 0.0010% 0.0021% 99.9554% ==================== Device Merge Information ==================== DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total ---------- | -------- -------- ------- | -------- -------- -------- -------- ( 8, 0) | 41 11 3.7 | 8 29 144 328 |
- Q2I – time it takes to process an I/O prior to it being inserted or merged onto a request queue – Includes split, and remap time
- I2D – time the I/O is “idle” on the request queue
- D2C – time the I/O is “active” in the driver and on the device
- Q2I + I2D + D2C = Q2C
- Q2C: Total processing time of the I/O
注意:
D2C: 表征块设备性能的关键指标