blktrace对于分析block I/O是个非常好的工具,本篇文章记录了如何使用blktrace。
blktrace原理
blktrace是对通用块层(block layer)的I/O跟踪机制,它能抓取详细的I/O请求(request),发送到用户空间。
blktrace主要由3部分组成:
- 内核部分
- 记录内核到用户空间的I/O追踪信息的程序
- 分析、展示I/O追踪信息的程序
主要在block layer实现,抓取的数据通过debugfs来传递。每个被跟踪的设备都有一个在debugfs挂载目录的文件。debugfs挂载目录默认是:/sys/kernel/debug
用官方的一张图来直观的展现:
一个I/O请求进入block layer之后,可能会经历下面的过程:
- Remap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备
- Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O
- Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O
- 被I/O Scheduler依照调度策略发送给driver
- 被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成I/O请求之后再把结果发回。
blktrace使用
安装blktrace包
yum
install
blktrace
追踪指定设备的I/O
[root@k8s-slave9 longterm_io]
# blktrace -d /dev/sde
^C=== sde ===
CPU 0: 38 events, 2 KiB data
CPU 1: 1 events, 1 KiB data
CPU 2: 232 events, 11 KiB data
CPU 3: 2 events, 1 KiB data
CPU 4: 41 events, 2 KiB data
...
Total: 567 events (dropped 0), 27 KiB data
-d <dev> 指定具体的设备名
上面是抓取一段时间后,Ctrl+C中止的。也可以指定时间:-w <seconds>
blktrace执行完之后,会生产很多文件,每个CPU都会有一个文件,文件名组成:<设备名>.blktrace.<CPU id>,如下:[root@k8s-slave9 longterm_io]
# ls
sde.blktrace.0 sde.blktrace.12 sde.blktrace.16 sde.blktrace.2 sde.blktrace.23 sde.blktrace.27 sde.blktrace.30 sde.blktrace.34 sde.blktrace.38 sde.blktrace.6
...
抓取IO信息,完成了第一步,我们要分析这些I/O,就需要下面的工具。
blkparse分析数据
-
解析IO追踪信息
blkparse是一个会把不同CPU的I/O trace文件合并,并解析、格式化输出为对用户可读友好IO信息的工具。
先把上面生成的所有CPU I/O trace文件合并成一个文件:
[root@k8s-slave9 longterm_io]
# blkparse -i sde -d sde.blktrace.bin
Input
file
sde.blktrace.0 added
Input
file
sde.blktrace.1 added
Input
file
sde.blktrace.2 added
Input
file
sde.blktrace.3 added
Input
file
sde.blktrace.4 added
...
-----------------------------第一个IO开始
8,64 35 1 0.000000000 28378 A W 470236984 + 40 <- (8,65) 470234936
8,64 35 2 0.000000670 28378 Q W 470236984 + 40 [kworker
/u82
:1]
8,64 35 3 0.000005125 28378 G W 470236984 + 40 [kworker
/u82
:1]
8,64 35 4 0.000005443 28378 P N [kworker