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 。它通过这个文件于内核进行交互,并获取信息。
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