blktrace
是一个强大的 Linux 工具,用于跟踪块设备的 I/O 操作。通过它,你可以捕获和分析块设备 I/O 请求的详细信息,比如队列时间、调度延迟、完成时间等。以下是 blktrace
的详细用法和常见分析场景。
1. 什么是 blktrace?
blktrace
是一个内核级工具,用于实时跟踪块设备的 I/O 请求。它提供了对以下信息的深入分析能力:
I/O 请求:读、写、同步、异步等。
调度过程:请求何时进入队列、被调度、发往设备。
延迟分析:队列时间、调度延迟、完成时间等。
2. 安装 blktrace
2.1 安装命令
在大多数 Linux 发行版中,你可以直接通过包管理器安装 blktrace
。
Debian/Ubuntu
bash
复制
sudo apt update
sudo apt install blktrace
RHEL/CentOS/Fedora
bash
复制
sudo yum install blktrace
# 或使用 dnf
sudo dnf install blktrace
检查安装
安装完成后可以通过以下命令验证:
bash
复制
blktrace --help
3. blktrace 的基本用法
3.1 跟踪块设备
要跟踪一个块设备的 I/O 操作,使用以下命令:
bash
复制
sudo blktrace -d <设备路径>
示例:
bash
复制
sudo blktrace -d /dev/sda
-d
:指定要跟踪的块设备(如/dev/sda
、/dev/nvme0n1
)。输出会显示实时的 I/O 事件信息。
3.2 保存跟踪数据到文件
如果需要将跟踪数据保存以便后续分析,可以使用 -o
选项:
bash
复制
sudo blktrace -d /dev/sda -o output
-o <文件名前缀>
:保存跟踪数据,生成多个文件(如output.blktrace.0
)。如果设备有多个队列或 CPU 核心,会为每个队列生成一个文件。
3.3 限制跟踪时间
你可以使用 -w
选项指定跟踪时长(单位为秒):
bash
复制
sudo blktrace -d /dev/sda -o output -w 10
该命令会对
/dev/sda
进行 10 秒的跟踪,并将数据保存到文件。
3.4 实时查看 I/O 事件
如果希望实时查看块设备的 I/O 请求,可以直接运行:
bash
复制
sudo blktrace -d /dev/sda
4. 分析 blktrace 的输出数据
blktrace
生成的原始数据不易阅读,需要配合 blkparse
工具对其进行解析。
4.1 使用 blkparse 解析数据
bash
复制
sudo blkparse -i output
-i
:指定输入文件的前缀(如output
)。输出的解析内容示例:
plaintext
复制
8,0 0 1 0.000000000 123 Q R 123456 + 8 [app] 8,0 0 2 0.000001000 123 G R 123456 + 8 [app] 8,0 0 3 0.000002000 123 I R 123456 + 8 [app] 8,0 0 4 0.000003000 123 C R 123456 + 8 [app]
字段解释
事件类型
4.2 使用 btt(Block Trace Tools)生成统计信息
btt
是一个分析工具,可以基于 blkparse
的输出生成统计摘要。
示例:
bash
复制
sudo blkparse -i output -o output.parsed
sudo btt -i output.parsed
输出示例:
plaintext
复制
Total Q2Q time: 123.45 ms Total IOs completed: 1000 Read IOs: 600 Write IOs: 400 Average Q2C time: 1.23 ms
Q2Q time:队列之间的时间。
IOs completed:完成的 I/O 请求数量(区分读写)。
5. 常见场景和用法
5.1 分析 I/O 请求延迟
通过 blktrace
捕获 I/O 请求的生命周期,并解析其延迟。例如:
bash
复制
sudo blktrace -d /dev/sda -o output -w 5
sudo blkparse -i output
结果中可以看到:
队列时间(
Q
到G
的时间差)。调度延迟(
G
到I
的时间差)。完成时间(
I
到C
的时间差)。
5.2 分析块设备的读写模式
通过解析结果,可以分析设备的读写分布:
bash
复制
sudo blkparse -i output | grep -E ' W | R '
R
:表示读操作。W
:表示写操作。
5.3 分析队列性能
通过 btt
生成的统计信息,可以分析队列性能。例如:
bash
复制
sudo btt -i output.parsed
队列延迟(
Q2Q
、Q2C
)可以用来判断设备或调度器的性能瓶颈。
5.4 实时跟踪设备 I/O
如果需要实时监控块设备的 I/O 请求,可以直接使用:
bash
复制
sudo blktrace -d /dev/sda
6. 注意事项
权限要求:
blktrace
需要管理员权限(sudo
),因为它直接访问内核的块设备层。
性能开销:
跟踪块设备的操作会产生一定的系统开销,尤其是在高负载场景下,可能对性能有轻微影响。
设备支持:
确保目标设备支持块设备跟踪(如普通硬盘、SSD、NVMe 等),某些虚拟设备(如 loop 设备)可能不支持。
内核支持:
blktrace
依赖于 Linux 内核的块层跟踪机制,确保内核版本足够新(大多数现代发行版都支持)。
7. 总结
blktrace
是一个强大的工具,适合用于:分析存储设备的性能问题。
调试 I/O 延迟和队列行为。
优化存储系统的读写模式。
常见用法:
实时跟踪:
sudo blktrace -d /dev/sda
保存数据:
sudo blktrace -d /dev/sda -o output -w 10
解析数据:
sudo blkparse -i output
生成统计:
sudo btt -i output.parsed
通过灵活使用 blktrace
、blkparse
和 btt
,可以深入了解存储系统的 I/O 行为,帮助优化性能并解决瓶颈问题。
/root fio --group_reporting --name=fiotest -filename=/mnt/data/testfile --rw=randread --size=1G --bs=4k --direct=1 --numjobs=1 --ioengine=io_uring --iodepth=1
fiotest: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=io_uring, iodepth=1
fio-3.33
Starting 1 process
Jobs: 1 (f=1): [r(1)][100.0%][r=34.0MiB/s][r=8696 IOPS][eta 00m:00s]
fiotest: (groupid=0, jobs=1): err= 0: pid=10482: Fri Jun 13 11:10:28 2025
read: IOPS=8690, BW=33.9MiB/s (35.6MB/s)(1024MiB/30165msec)
slat (usec): min=33, max=1463, avg=42.62, stdev= 9.46
clat (nsec): min=471, max=2890.4k, avg=71106.22, stdev=16524.54
lat (usec): min=76, max=2952, avg=113.73, stdev=19.36
clat percentiles (usec):
| 1.00th=[ 53], 5.00th=[ 57], 10.00th=[ 64], 20.00th=[ 65],
| 30.00th=[ 67], 40.00th=[ 68], 50.00th=[ 70], 60.00th=[ 71],
| 70.00th=[ 72], 80.00th=[ 75], 90.00th=[ 81], 95.00th=[ 90],
| 99.00th=[ 130], 99.50th=[ 159], 99.90th=[ 231], 99.95th=[ 273],
| 99.99th=[ 449]
bw ( KiB/s): min=30096, max=37096, per=100.00%, avg=34769.60, stdev=1205.79, samples=60
iops : min= 7524, max= 9274, avg=8692.40, stdev=301.45, samples=60
lat (nsec) : 500=0.01%, 750=0.01%, 1000=0.01%
lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.38%
lat (usec) : 100=96.90%, 250=2.64%, 500=0.06%, 750=0.01%, 1000=0.01%
lat (msec) : 4=0.01%
cpu : usr=1.21%, sys=44.63%, ctx=262123, majf=0, minf=11
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=262144,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
READ: bw=33.9MiB/s (35.6MB/s), 33.9MiB/s-33.9MiB/s (35.6MB/s-35.6MB/s), io=1024MiB (1074MB), run=30165-30165msec