1. 基本概念
blktrace是一个针对Linux内核中块设备I/O层的跟踪工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,因此叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的信息)。经过使用这个工具,使用者能够获取I/O请求队列的各类详细的状况,包括进行读写的进程名称、进程号、执行时间、读写的物理块号、块大小等等,是一个Linux下分析I/O相关内容的很好的工具。
blkparse是配合blktrace使用的分析工具。在Unix类系统设计中,有个理念叫一切皆文件。所以,咱们会发现不少系统性能信息其实来自于/proc/中的文件。这个目录实际上是虚拟文件系统,cgroup也是相似的东西。这是一个颇有意思的方式让Linux内核空间和用户空间进行通讯。blktrace则是使用了另外一个虚拟文件系统,/sys/kernel/debug 。它经过这个文件于内核进行交互,并获取信息。app
2. 实现原理
blktrace的采集位置是block层,也称为块设备层。在io调度层上面。cgroup中blkio.throttle.*等限制也是在这个层(也有图是把块设备层画在io调度层上一层)。图中的pdflush就是操做系统page cache回写的线程。 函数
blktrace测试的时候,会分配物理机上逻辑cpu个数个线程,而且每个线程绑定一个逻辑cpu来收集数据。而后,它会在/sys/kernel/debug(debugfs)中产生和每一个线程对应的文件,而后调用ioctl函数,产生系统调用和内核交互。内核就会往文件中写入数据。工具
3. 使用方法
sudo mount -t debugfs debugfs /sys/kernel/debug
sudo blktrace /dev/sdb
blkparse sdb -d sdb.bin >/dev/null
btt -A -i sdb.bin性能
4. 字段说明
A
映射值对应设备 IO was remapped to a different device
B
IO反弹,因为32位地址长度限制,因此须要copy数据到低位内存,这会有性能损耗。IO bounced
C
IO完成 IO completion
D
将IO发送给驱动 IO issued to driver
F
IO请求,前合并 IO front merged with request on queue
G
获取 请求 Get request
I
IO插入请求队列 IO inserted onto request queue
M
IO请求,后合并 IO back merged with request on queue
P
插上块设备队列(队列插入机制) Plug request
Q
io被请求队列处理代码接管。 IO handled by request queue code
S
等待发送请求。 Sleep request
T
因为超时而拔出设备队列 Unplug due to timeout
U
拔出设备队列 Unplug request
X
开始新的扇区 Split
测试