工具

简介

Blktrace是针对Linux内核中Block IO的跟踪工具,属于内核block layer,是系统提供的工具

Blktrace(跟踪器)原理

1、整个Block I/O框架可以分为三层:VFS、Block和I/O设备驱动

  • VFS(file system layer)
  • Block(block layer)
  • IO驱动(device driver)

2、该工具可以获取IO请求队列的详细情况,包括

  • 读写进程名、
  • 进程号、
  • 执行时间、
  • 读写物理块号、
  • 块大小等

3、该工具的实际工作方式:

  • 针对Linux内核中Block IO的跟踪工具,属于内核block layer
  • blktrace在运行的时候会在/sys/kernel/debug/block下面设备名称对应的目录,并生成四个文件droppeed/msg/trace0/trace2
  • blktrace通过ioctl对内核进行设置,从而抓取log
  • blktrace针对系统每个CPU绑定一个线程来收集相应数据

4、该工具的使用方式:

  • 查看是否安装blktrace -v,没有则安装
  • 使用方式,即执行命令如下:
//1、实时查看磁盘IO数据
blktrace -d -filename -o - | blkparse -i -

//2、Blktrace工具一共包含三个可执行文件:blktrace、blkparse、btt
blktrace -d /dev/sda    //采集信息:会根据cpu个数来生成文件个数,名为{device}.blktrace.{cpu}
blkparse -i sda.blktrace.0    //分析信息(可选执行):blkparse会将blktrace生成的文件转换有阅读性的信息
blkparse -i sda -d sda.blktrace.bin    //合并信息:要执行btt就必须先把blktrace生成的文件进行合并处理
btt -i sda.blktrace.bin    //统计信息:将合并的信息分解生成很多个与名字相关的文件信息

注:(该注意事项还需要证实)

blktrace需要debugfs的支持,如果系统提示debugfs没有mount,需先mount
执行 mount -t debugfs none /sys/kernel/debug 再执行blktrace命令

5、博主使用记录

测试1

blktrace -d /dev/sda    //采集信息:生成 sda.blktrace.0
注:blktrace -d /dev/sda -w 60    //采集60s信息

blkparse -i sda -d sda.blktrace.bin    //合并信息:生成 sda.blktrace.bin
注:将对应不同cpu的多个文件合并为一个文件

btt -i sda.blktrace.bin    //分析信息:生成所有的 .dat 文件
注:生成文件说明
sys_mbps_fs.dat  //本次统计中所有设备吞吐量
sys_iops_fp.dat  //本次统计中所有设备IO速率

阅读 btt User Guide 文档

第2节 入门

1、运行 blktrace,指定你想测试的设备,traces必须保存,因为btt不能实时工作
2、跟踪完成后,运行 blkrawverify,列举被跟踪的所有设备,如果使用blkrawverify 发现在保存的跟踪流中的错误,最好重新捕获数据,在错误的跟踪文件上使用btt会产生不一致结果
3、运行 blkparse -d 指定一个文件来存储组合二进制流。(例如:blkparse -d bp.bin ...)

  • blktrace 生成一系列类似的跟踪流的二进制文件 – 每个设备每个 CPU 一个文件。
  • blkparse 将所有设备的所有文件合并到一个按时间顺序排列的跟踪流中。

4、运行 btt -i 并指定 blkparse 生成的文件(例如: btt -i bp.bin ...)

第3节 输出介绍

average component times across all IOs(所有 IO 的平均组件时间)
1、将传入的 IO 插入或合并到请求队列所需的时间。

  • 这是从 IO 进入块 IO 层(队列跟踪)到插入(插入跟踪)的平均时间。
  • 用Q2I时间表示,还可以拆分为Q2G时间和G2I时间
  • 合并请求可以用Q2M时间表示

2、插入到下发之间的时间,用I2D时间表示
3、从发送到驱动到请求完成的时间,用D2C时间表示
4、还包括另外两个参数测试结果

  • 测量系统中队列跟踪之间的时间,用Q2Q时间表示
  • 测量运行期间 IO 的完整生命周期的时间,用Q2C时间表示

Device Overhead(设备开销占比)

  • 使用上一个图表中的数据,我们可以知道 IO 平均花费大部分时间的地方。
  • 以下输出显示了在 IO 的每个阶段所花费的时间百分比。

Device Merge Information(设备合并信息)

  • 在系统(软件或硬件)中进行更改时的一个关键度量是了解块 IO 层最终将传入请求合并到底层驱动程序的更少但更大的 IO 中。
  • 在本节中,我们将显示传入请求的数量 (Q)、发出的请求数量 (D) 和结果比率。
  • 我们还提供了生成的最小、平均和最大 IO 的值。

Device Seek Information(设备搜索信息)

  • 另一个有用的衡量标准是连续接收——排队和提交——发出的 IO 之间扇区距离的可变性。
  • 接下来的两节提供了一些基本统计数据,以衡量 IO 之间扇区差异的一般性质。
  • 提供的值包括搜索次数(提交给较低级别​​驱动程序的 IO 数量)、IO 之间的平均距离、所有搜索的中值以及模式 - 为后者提供了值和计数。

Request Queue Plug Information(请求队列阻塞信息)

  • 在正常操作期间,请求队列被插入,在此期间,IO 请求队列元素无法由底层驱动程序处理。
  • 下一部分显示请求队列处于这种状态的频率。
  • IOs per Unplug & Unplugs-due-to-timeout
  • 在本小节中,可以看到拔出或因超时拔出时请求队列上的平均 IO 数。

Active Requests At Q Information(Q信息处的活动请求)

  • 分析块 IO 调度程序时的一个重要考虑因素是了解调度程序必须处理多少请求。
  • 本节中提供的指标详细说明了在处理传入 IO 请求时 IO 调度程序保留了多少请求(平均)。
  • 为了确定这一点,btt 会跟踪有多少 Q 请求进来,并减去已发出的请求 (D)。

I/O Active Period Information(IO活动期信息)

  • 在本小节中,数据列表显示了每个设备上的 I/O 活动以及被跟踪的所有设备上的 I/O 活动。
  • “I/O 活动”被定义为底层设备驱动程序和设备至少有一个 I/O 可以处理的时间段。

详细数据(除了默认部分输出之外,如果向 btt 提供 --all-data 或 -A 参数,则会输出更多信息)

  • Per Process(每个进程)
  • Per Process Averages(每个进程的平均值)
  • Per Device(每个设备)
  • Per Device Averages(每台设备平均值)
  • Q2D Histogram(Q2D直方图)

 第4节 data文件输出(可用于绘图)

1、同时会生成可以用于绘制图形data文件。如下:

  • file.dat  //该文件提供了系统、设备和进程的活动概念。
  • file_qhist.dat  //提供传入 IO 请求大小的直方图数据。
  • file_dhist.dat  //提供提交给低层驱动程序的 IO 请求大小的直方图数据。
  • file_mbps_fp.dat  //为每秒 mb-per-second 值提供一组数据。
  • file_iops_fp.dat  //为每秒 I/Os-per-second 值提供一组数据。

2、除了默认的数据文件输出之外,还有一些可选的数据文件可以由 btt 生成。如下:

  • subset of .avg data, easily parsed
  • iostat
  • per IO detail
  • seek details
  • unplug histogram details

第5节 activity数据文件(可用于绘图)

1、该文件被分成多组数据点,其中每对包含一组队列活动和一组完成活动。
2、Total System : q / c activity  //以第一列为x值表示时间(以秒为单位),第二列为y值提供开/关类型的设置
3、每队的排列遵从:

  • 首先是总系统活动——意味着队列中的活动或所有设备的完成跟踪。
  • 接下来是每个设备的活动信息——对于每个被跟踪的设备,都会显示请求队列 Q 和 C 跟踪。
  • 最后我们展示了每个进程对。

4、使用这一点,人们就可以绘制活动区域与不活动区域的图——并且可以收集 IO 排队与完成时间之间的直观变化。

第6节 直方图数据文件(可用于绘图)

1、直方图数据文件提供有关传入和传出 IO 大小(以块为单位)的信息。
2、为简单起见,对于 IO 中最多 1,024 个块的大小,直方图存储区是一对一的,然后对于大于或等于 1,024 个块的所有大小的单个存储区。
3、这些文件再次采用优雅友好的格式,第一组包含前 1,023 个存储桶的数据,另外一组表示大小 ≥ 1024 块。(这样做是为了可以轻松地为后一组使用单独的格式规范。)第一列(X 值)是各种 IO 大小,第二列(Y 值)表示该大小的 IO 数量。

  • Q Histogram Data File
  • D Histogram Data File

第7节 运行统计文件(可用于绘图)

1、为每个被跟踪的所有设备(以 sys 为前缀)和每个设备(以设备标识符为前缀)生成了两个文件。
2、这两个文件用于报告 I/O 速率(每秒 I/O 数 - 名称以 iops fp.dat 结尾)和吞吐量(每秒 MiB - 名称以 mbps fp.dat 结尾)。
3、文件中的数据有两列:

File Type    X values    Y values
iops         runtimes    I/Os-per-second
mbps         runtimes    MiB-per-second

第8节 iostat数据文件

1、btt 尝试在跟踪系统时通过与系统并行运行 iostat -x 命令来生成结果。
2、可以从以下输出片段中看到由 --iostat 或 -I 选项生成的字段(列)

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util Stamp

第9节 Per-IO数据文件

1、btt 可以为每个处理的 IO 生成一个包含时间线数据的文本文件。

2、时间线数据包含以下阶段的基本信息:

  • queue traces
  • get request traces
  • insert traces
  • merge traces
  • issue traces
  • completion traces
  • remap traces

–per-io-dump 或 -p 选项会触发此行为,并将生成一个包含 IO 流(由空格分隔)的文件。每个 IO 都会复制问题和完成跟踪。
3、这些列提供以下信息:

  • Device major/minor    //设备主/次
  • Time of the trace (seconds from the start of the run)   //跟踪时间
  • Trace type   //跟踪类型
  • start block + number of blocks   //起始块 + 块数

第10节 Latency数据文件

1、btt 可以选择生成的延迟数据文件提供每个 IO 的延迟信息,一个是队列时间 (Q2D),一个是总 IO 时间 (Q2C),一个是由较低层驱动程序和设备引起的延迟 (D2C)。
2、在这两种情况下,第一列(X 值)表示运行时间(秒),而第二列(Y 值)显示当时命令的实际延迟(Q2D、D2C 或 Q2C)

第11节 Seek数据文件(可用于绘图)

1、btt 还可以生成两个包含所有 IO 到 IO 扇区增量的数据文件,提供可以绘制的搜索信息。
2、生成的数据文件包含3组数据:

  • Combined data – all read and write IOs //组合数据 所有读写 IO
  • Read data – just seek deltas for reads //读取数据 为读取寻找增量
  • Write data – just seek deltas for writes //写入数据 为写入寻找增量

3、输出文件名的格式是由以下以下划线分隔的字段生成的名称:

  • 作为 -s 选项的参数提供的前缀。
  • 设备的主要和次要编号以逗号分隔。
  • 字符串q2q 或d2d,分别表示Q2Q 或D2D 搜索。
  • 以下字符: r 用于读取(设备到系统)IO w 用于写入(系统到设备)IO c 组合读取和写入 IO

4、指定 -s seek 后的示例名称为:seek 065,048 q2q w.dat。
数据的格式是在第 1 列(X 值)中包含运行时值(自运行开始以来的秒数);以及第 2 列(Y 值)中与前一个 IO 的扇区差异。

5、默认情况下,寻道距离计算为前一个 IO 和此 IO 之间的最近距离。
接近度的概念意味着它可以是前一个 IO 的结束和此 IO 的开始,或者此 IO 的结束和下一个 IO 的开始。
如果指定了 -a 或 --seek-absolute 选项,则寻道距离是前一个 IO 结束与此 IO 开始之间的差值。

第12节 命令行(btt工具的命令行)(区分大小写)

[root@localhost ~]# btt
Usage: btt 2.09
[ -a               | --seek-absolute ]
//设置计算寻道距离的方式
[ -A               | --all-data ]
//指定该参数用于 btt 打印出有关每个进程和每个设备数据的详细信息(第 3 节)
[ -B <output name> | --dump-blocknos=<output name> ]
//此选项会将绝对块编号输出到以指定输出名称为前缀的三个文件:输出所有读取、写入、读写的块号,第一列是时间(秒),第二列是块号,第三列是结束块号
[ -d <seconds>     | --range-delta=<seconds> ]
//使用此选项可以更改该粒度,默认值为 0.1 秒。值越小,提供的数据点越多。(第 5 节讨论了 btt 如何输出包含 Q 和 C 活动的文件,活动轨迹的概念仅意味着在彼此的某个时间段内发生 Q 或 C 轨迹。)
[ -D <dev;...>     | --devices=<dev;...> ]
//通常情况下,BTT将产生在解析的跟踪中检测到所有设备的数据。使用此选项,可以将分析减少到传递给此选项的字符串中提供的一个或多个设备。设备标识符是每个设备的主要和次要编号,每个设备标识符之间用冒号 (:) 分隔。例如:设备 8,0 和 8,8 的有效说明符将是:“8,0:8,8”。
[ -e <exe,...>     | --exes=<exe,...>  ]
//同样 btt 将为跟踪中找到的所有进程(可执行文件)生成数据。使用此选项,您可以指定要在输出中显示的进程。传递的字符串的格式是由逗号 (,) 分隔的可执行文件名称列表。例子:“-e mkfs.ext3,mount”。
[ -h               | --help ]
//打印出简单的帮助信息(第 12 节)
[ -i <input name>  | --input-file=<input name> ]
//指定 btt 解析跟踪的二进制输入文件。(第 2 节)
[ -I <output name> | --iostat=<output name> ]
//触发 btt 生成类似 iostat 的输出到指定的文件。
[ -l <output name> | --d2c-latencies=<output name> ]
//指定 btt 生成 D2C 延迟文件。
[ -L <freq>        | --periodic-latencies=<freq> ]
//当给定的值大于 0 时,此选项将为每个设备创建两个数据文件(q2c 和 d2c),其中包含该期间的周期性时间戳和平均延迟。
[ -m <output name> | --seeks-per-second=<output name> ]
//指定 btt 输出每秒搜索次数信息。每个被测量的设备最多可以有 2 个文件输出:一个带有 Q2Q 信息,一个带有 D2D 寻道信息。(第 11.1 节)
[ -M <dev map>     | --dev-maps=<dev map> ]
//内部选项,仍在建设中。
[ -o <output name> | --output-file=<output name> ]
//通常 btt 将统计输出发送到标准输出,如果您指定此选项,则此数据将重定向到指定的文件。(第 3 节)
[ -p <output name> | --per-io-dump=<output name> ]
//此选项告诉 btt 生成每个 IO 转储文件(第 9 节)
[ -P <output name> | --per-io-trees=<output name> ]
//此选项将生成一个文件,其中包含所有 IO“序列”的列表 - 仅显示 Q、D 和 C 操作时间。 D & C 时间值与 Q 时间值用竖线分开。
[ -q <output name> | --q2c-latencies=<output name> ]
//指示 btt 生成 Q2C 延迟文件(第 10 节)
[ -Q <output name> | --active-queue-depth=<output name> ]
//指示 btt 生成一个数据文件(使用给定的名称作为基础),其中包含: 第一列中的时间戳,然后是向设备驱动程序发出的活动请求数。(该值在执行问题时增加,执行完成时减少)
[ -r               | --no-remaps ]
//忽略remap跟踪;旧内核没有实现完整的 remap PDU
[ -s <output name> | --seeks=<output name> ]
//指示 btt 生成搜索数据文件(第 11 节)
[ -S <interval>    | --iostat-interval=<interval> ]
//普通的 iostat 命令允许您指定快照间隔,同样 btt 允许您通过此选项指定其生成数据快照之间的秒数。(第 8 节)
[ -t <sec> and -T <sec>   | --time-start=<sec> and --time-start=<sec>]
//这些选项允许指定何时开始,到停止分析跟踪数据的秒数,因为运行开始。选择的跟踪将在指定的开始时间(或未指定的 0.0)和结束时间(或运行结束)之间。
[ -u <output name> | --unplug-hist=<output name> ]
//指示 btt 生成包含直方图信息的数据文件,以便在每个设备的基础上拔下痕迹。它显示了用指定数量的IO发出拔掉插头的次数。
[ -V               | --version ]
//打印出btt版本,然后退出
[ -v               | --verbose ]
//当 btt 正在处理数据时,它将定期(1 秒)值,描述它通过输入跟踪流所取得的进展。该值描述了已处理的痕迹数。在运行结束时,显示跟踪总数、跟踪速率(每秒数千个痕迹的数量)以及跟踪处理和输出的实时。示例(注意:临时微量计数与车厢返回一起放出,因此,它们每次都覆盖)
[ -X               | --easy-parse-avgs ]
//默认情况下生成的某些数据也可以同时以易于分析的形式发送到其他文件。当选择-o选项(从而生成具有.avg提升的文件)并且存在-X标志时,btt 将生成此文件。
[ -z <output name> | --q2d-latencies=<output name> ]
//指示 btt 生成 Q2D 延迟文件。(第 10 节)
[ -Z               | --do-active ]
//此选项生成每个设备(和总系统)数据文件。每个文件都包含一个类似于正时图的数据线:低含义 I/O 非活动,高含义 I/O 活动。

第13节 bno_plot.py

1、分布包括一个简单的 3D 绘图实用程序,基于指定 -B 时的块数输出(有关 -B 选项的更多详细信息,请参阅第 12.3 节)。
2、图形将显示生成的每个 IO,沿 X 轴的时间(秒),沿 Y 轴的块数(开始)以及沿 Z 轴表示的 IO 中传输的块数。

bno_plot.py的命令行参数
        bno_plot.py
            [ -h | --help       ]
            [ -K | --keys-below ]
            [ -v | --verbose    ]
            [ <file...>         ]

第14节 Sample btt Output

1、下面是一个完整的btt运行输出文件示例,说明了很多btt的功能。
==================== All Devices ====================
==================== Device Overhead ===================
==================== Device Merge Information ====================
==================== Device Q2Q Seek Information ====================
==================== Device D2D Seek Information ====================
==================== Plug Information ====================
==================== Active Requests At Q Information ====================
==================== Q2D Histogram ====================

博客园文作者:Citrusliu 博文地址:https://www.cnblogs.com/citrus
原文地址:https://www.cnblogs.com/citrus/p/15149707.html