xiedeacc
发布于 2025-06-13 / 0 阅读
0
0

块设备文件性能分析

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]
    

字段解释

字段

含义

8,0

块设备号(主设备号、副设备号)。这里 8,0 通常表示 /dev/sda

0

CPU 核心编号。

1, 2, 3, 4

事件编号。

0.000000000

时间戳(相对于跟踪开始的时间)。

123

I/O 请求 ID。

Q/G/I/C

事件类型(见下表)。

R/W

请求类型:R 表示读,W 表示写。

[app]

引发 I/O 请求的进程(如应用程序名)。

事件类型

事件

含义

Q

请求进入 I/O 队列(Queued)。

G

请求被调度(Get request)。

I

请求被发往设备(Issued)。

C

请求完成(Completed)。


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
  • 结果中可以看到:

    • 队列时间QG 的时间差)。

    • 调度延迟GI 的时间差)。

    • 完成时间IC 的时间差)。


5.2 分析块设备的读写模式

通过解析结果,可以分析设备的读写分布:

bash

复制

sudo blkparse -i output | grep -E ' W | R '
  • R:表示读操作。

  • W:表示写操作。


5.3 分析队列性能

通过 btt 生成的统计信息,可以分析队列性能。例如:

bash

复制

sudo btt -i output.parsed
  • 队列延迟(Q2QQ2C)可以用来判断设备或调度器的性能瓶颈。


5.4 实时跟踪设备 I/O

如果需要实时监控块设备的 I/O 请求,可以直接使用:

bash

复制

sudo blktrace -d /dev/sda

6. 注意事项

  1. 权限要求

    • blktrace 需要管理员权限(sudo),因为它直接访问内核的块设备层。

  2. 性能开销

    • 跟踪块设备的操作会产生一定的系统开销,尤其是在高负载场景下,可能对性能有轻微影响。

  3. 设备支持

    • 确保目标设备支持块设备跟踪(如普通硬盘、SSD、NVMe 等),某些虚拟设备(如 loop 设备)可能不支持。

  4. 内核支持

    • 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

通过灵活使用 blktraceblkparsebtt,可以深入了解存储系统的 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


评论