BLKTRACE

原文网址:http://linuxperf.com/?p=161

一、前言:在Linux系统上,如果I/O发生性能问题,如何进一步定位,iostat中await表示单个I/O所需的平均时间,但它同时包含了I/O Scheduler所消耗的时间和硬件所消耗的时间,所以不能作为硬件性能的指标(但是绝对可以作为参考),至于iostat的svctm更是一个废弃的指标,手册上已经明确说明了的。blktrace在这种场合就能派上用场,因为它能记录I/O所经历的各个步骤,从中可以分析是IO Scheduler慢还是硬件响应慢。。

二、blktrace的原理
一个 I/O请求进入block layer之后,可能会经历下面的过程:
1、Remap:可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备 典型如我们ceph中rbd提供的块设备,io下来之后会被ceph最中remap到各个物理磁盘
2、Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O 典型如我们设置的最大块请求太小,io会被切分。I/O与扇区不对齐,也会被切分
3、Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O
4、被IO Scheduler依照调度策略发送给driver
5、被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成IO请求之后再把结果发回。

相关字母的含义:
Q – 即将生成IO请求
|
G – IO请求生成
|
I – IO请求进入IO Scheduler队列
|
D – IO请求进入driver
|
C – IO请求执行完毕
根据以上步骤对应的时间戳就可以计算出I/O请求在每个阶段所消耗的时间:
Q2G – 生成IO请求所消耗的时间,包括remap和split的时间;
G2I – IO请求进入IO Scheduler所消耗的时间,包括merge的时间;
I2D – IO请求在IO Scheduler中等待的时间;
D2C – IO请求在driver和硬件上所消耗的时间;
Q2C – 整个IO请求所消耗的时间(Q2I + I2D + D2C = Q2C),相当于iostat的await。

如果I/O性能慢的话,以上指标有助于进一步定位缓慢发生的地方:
D2C可以作为硬件性能的指标;
I2D可以作为IO Scheduler性能的指标

blktrace的用法:
1、使用blktrace需要挂载debugfs:
$ mount -t debugfs debugfs /sys/kernel/debug

2、利用blktrace查看实时数据的方法,比如要看的硬盘是sdb:
$ blktrace -d /dev/sdb -o – | blkparse -i – 或者 btrace /dev/sdb
需要停止的时候,按Ctrl-C

3、输出分析文件
blktrace -d /dev/sdb
缺省的输出文件名是 sdb.blktrace.,每个CPU对应一个文件
你也可以用-o参数指定自己的输出文件名

4、利用blkparse命令分析blktrace记录的数据,前提是已经使用blkrace生成出了分析文件
$ blkparse -i sdb

三、利用btt分析blktrace数据
1、blkparse只是将blktrace数据转成可以人工阅读的格式,由于数据量通常很大,人工分析并不轻松。btt是对blktrace数据进行自动分析的工具。btt不能分析实时数据,只能对blktrace保存的数据文件进行分析
2、使用方法:
a、把原本按CPU分别保存的文件合并成一个,合并后的文件名为sdb.blktrace.bin:
$ blkparse -i sdb -d sdb.blktrace.bin
b、执行btt对sdb.blktrace.bin进行分析:

$ btt -i sdb.blktrace.bin
ALL                      MIN           AVG           MAX           N
--------------- ------------- ------------- ------------- -----------

Q2Q               0.000004029   0.013453607   0.101373129          99
Q2G               0.000000566   0.000002447   0.000005376          99
G2I               0.000000630   0.000002817   0.000016319          99
Q2M               0.000002275   0.000002275   0.000002275           1
I2D               0.000004978   0.007059367   0.085745695          98
M2D               0.003530676   0.003530676   0.003530676           1
D2C               0.000423682   0.013747007   0.048565023          98
Q2C               0.000432098   0.020823410   0.126867097          98

==================== Device Overhead ====================

       DEV |       Q2G       G2I       Q2M       I2D       D2C
---------- | --------- --------- --------- --------- ---------
 (  8, 64) |   0.0119%   0.0137%   0.0001%  33.9011%  66.0171%
---------- | --------- --------- --------- --------- ---------
   Overall |   0.0119%   0.0137%   0.0001%  33.9011%  66.0171%

分析:
1、66.0171%的时间消耗在D2C,33.9011%的时间消耗在I2D。这里D2C衡量的就是硬件指标,I2D可以作为IO Scheduler性能的指标
2、上述时间单位是秒,可以看到硬件处理单个io请求时间在13.747007毫秒,单个IO最慢是48.565023(注意这里好的磁盘单个IO请求能在1毫秒以下)
3、Q2G和G2I都非常小,属于正常情况,一般这两个时间要求可忽略,在微妙级别
4、I2D可以看到非常大:7.059367ms,一般这个都在微秒级别

扫描二维码关注公众号,回复: 8871928 查看本文章
发布了307 篇原创文章 · 获赞 6 · 访问量 8601

猜你喜欢

转载自blog.csdn.net/qq_23929673/article/details/93176725