硬盘读写追踪工具Blktrace&Blkparse

来源:互联网 发布:mysql修复数据库命令 编辑:程序博客网 时间:2024/05/29 14:17


1. Blktrace和Blkparse简介


blktrace是一个针对Linux内核中块设备I/O层的跟踪工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的信息)。通过使用这个工具,使用者可以获取I/O请求队列的各种详细的情况,包括进行读写的进程名称、进程号、执行时间、读写的物理块号、块大小等等,是一个Linux下分析I/O相关内容的很好的工具。

blkparse是配合blktrace使用的分析工具。等于说,blktrace采集数据,blkparse分析和展示数据

1.1 Blktrace如何获取数据

在Unix类系统设计中,有个理念叫一切皆文件。因此,我们会发现很多系统性能信息其实来自于/proc/中的文件。这个目录其实是虚拟文件系统.Cgroup也是类似的东西。这是一个很有意思的方式让Linux内核空间和用户空间进行通信。blktrace则是使用了另一个虚拟文件系统,/sys/kernel/debug 。它通过这个文件于内核进行交互,并获取信息。

1.1.1 Blktrace的采集位置

blktrace的采集位置是block层,也称为块设备层。在io调度层上面。Cgroup中blkio.throttle.*等限制也是在这个层(也有图是把块设备层画在io调度层上一层)。图中的pdflush就是操作系统page cache回写的线程。

1.1.2 流程


  1. blktrace测试的时候,会分配物理机上逻辑cpu个数个线程,并且每一个线程绑定一个逻辑cpu来收集数据

  2.  然后,它会在/sys/kernel/debug(debugfs)中产生和每个线程对应的文件,然后调用ioctl函数,产生系统调用和内核交互。内核就会往文件中写入数据。

下面的目录信息就是在blktrace打开时,产生的文件。当blktrace关闭。这些文件就会消失。

    [root@myb145147.sqa.zmf /sys/kernel/debug/block]

    #tree

    .

    `-- sdb

        |-- dropped

        |-- msg

        |-- trace0

        |-- trace1

        |-- trace10

        |-- trace11

        |-- trace12

        |-- trace13

        |-- trace14

        |-- trace15

        |-- trace2

        |-- trace3

        |-- trace4

        |-- trace5

        |-- trace6

        |-- trace7

        |-- trace8

        `-- trace9

    

    1 directory, 18 files


1.1.3 Debugfs挂载


    mount  –t debugfs    debugfs /sys/kernel/debug

2. Blktrace和Blkparse的用法:


2.1 参数

  

 2.1.1 blktarce:  

  • -o 指定输出位置,后面带的 - 是标准输出。

  • -d 指定要采集的设备。


 2.1.2 blkparse  

  • -i   指定输入文件

  • -f   指定输出格式(后面讲)


2.2 简单用法

我们用man blkparse时,看到最简单的使用命令就是:

blktrace -d /dev/sda -o - | blkparse -i -

这个命令串是直接把blktrace采集的信息用blkparse分析好打印出来,如果想停止,ctrl+C即可。

如果不这么用,可以去掉-o选项,会打印到当前目录。

当然,我们也可以先让blktarce采集出信息存到磁盘,然后再去分析。

blktrace -d /dev/sda

它会生成一系列sda.blktrace.*的文件,*号位置是数字,对应CPU号。其实和/sys/kernel/debug/block是对应的。然后可以用来读取。

blkparse -i da.blktrace.0

似乎随便指定一个文件,就会读取所有文件来分析。   

2.3 查看报告

在blkio停止时,会打印个简单的统计报告。展示抓取的事件。


使用blkparse主要是查看每个io事件。 


这里面,每行都是一个事件。第六行是大写字母,这是写的类型。

      

blkparse 的-f选项可以定义 。具体可以看man blkparse。格式类似C语言的printf格式。


    –f "%D %2c %8s %5T.%9t %5p %2a %3d "


  1. 8,0 按默认输出对应%D,主从设备号

  2. 1 按默认输出对应%2c,表示cpu id

  3. 27 按默认输出对应%8s,表示序列号,似乎是递增的(序列号是blkparse自己产生的一个序号,实际IO里没有这个号)

  4. 0.000072555 按默认对应%5T.%9t,表示”秒.纳秒”

  5. 1601 对应%5p,表示,进程id,例子中就是[flush-8:0]线程。

  6. Q对应%2a,表示Action,Action表格如下(如Q表示IO handled by request queue code),详细信息看后面的action表

  7. W 对应%3d,表示RWBS域(W表示写操作),各字母含义如下至少包含“RWD“( R 读,W写,D块被忽略)中的1个字符,还可以附加“BS“(B barrier,S同步)

  8. 后面还有 238140576 + 8 <- (8,5) 15316128 ,这个是写入的位置等信息。238140576为(8:0)块设备的起始扇区号,+8说明后面连着8个扇区,(8,5)是它的分区,后面是分区的扇区号。


2.4 锁定IO操作的文件

接着上面第8条数据,我们知道了设备块以及扇区位置。根据这个信息,我们就可以想办法定位到对应的文件

首先我们需要知道的是,扇区和块(簇)的区别。扇区是一个物理硬盘的概念,是物理硬盘读写的最小单位。块是操作系统的概念,操作系统中读写的最小单位。扇区大小标准是512B(其实硬盘的实例扇区大小现在已经是4k,甚至更大,但由于操作系统保留原标准,所以硬盘将其模拟成512B的扇区,这也就带来了4K对齐的问题),操作系统块通常可以自己设定,一般是4K。我们可以这样查看块的大小。

2.4.1 确定块位置

  

    #tune2fs -l /dev/sda5|grep Block

    Block count:              2621184

    Block size:               4096

    Blocks per group:         32768    

    

    可以看出,/dev/sda5的块是4k大小。扇区是512B。相差8倍。回到上面的(8,5),15316128号扇区。我们可以算出它的块号是,15316128/8=1914516


2.4.2 定位inode号

然后我们就可以根据这个定位出inode的位置。

#debugfs -R "icheck 1914516" /dev/sda5

debugfs 1.41.12 (17-May-2010)

BlockInode number

1914516537102

于是我们获得了inode号。

2.4.3 定位文件

根据inode就可以找到对应的文件了。

#find / -inum 537102

然后我们就可以用lsof来找出是哪个进程在操作这个文件

2.5 action表


2.6 统计数据

blkparse最后也会给出个统计数据。


里面的信息会对应每个cpu,以及最后有一个总的统计。


3. 结束

除了blkparse外,seekwatcher也是一个解析工具,只不过它是生成一个图片,对于大多使用命令行运维的Linux而言不是非常方便。


1. Blktrace和Blkparse简介


blktrace是一个针对Linux内核中块设备I/O层的跟踪工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的信息)。通过使用这个工具,使用者可以获取I/O请求队列的各种详细的情况,包括进行读写的进程名称、进程号、执行时间、读写的物理块号、块大小等等,是一个Linux下分析I/O相关内容的很好的工具。

blkparse是配合blktrace使用的分析工具。等于说,blktrace采集数据,blkparse分析和展示数据

1.1 Blktrace如何获取数据

在Unix类系统设计中,有个理念叫一切皆文件。因此,我们会发现很多系统性能信息其实来自于/proc/中的文件。这个目录其实是虚拟文件系统.Cgroup也是类似的东西。这是一个很有意思的方式让Linux内核空间和用户空间进行通信。blktrace则是使用了另一个虚拟文件系统,/sys/kernel/debug 。它通过这个文件于内核进行交互,并获取信息。

1.1.1 Blktrace的采集位置

blktrace的采集位置是block层,也称为块设备层。在io调度层上面。Cgroup中blkio.throttle.*等限制也是在这个层(也有图是把块设备层画在io调度层上一层)。图中的pdflush就是操作系统page cache回写的线程。

1.1.2 流程


  1. blktrace测试的时候,会分配物理机上逻辑cpu个数个线程,并且每一个线程绑定一个逻辑cpu来收集数据

  2.  然后,它会在/sys/kernel/debug(debugfs)中产生和每个线程对应的文件,然后调用ioctl函数,产生系统调用和内核交互。内核就会往文件中写入数据。

下面的目录信息就是在blktrace打开时,产生的文件。当blktrace关闭。这些文件就会消失。

    [root@myb145147.sqa.zmf /sys/kernel/debug/block]

    #tree

    .

    `-- sdb

        |-- dropped

        |-- msg

        |-- trace0

        |-- trace1

        |-- trace10

        |-- trace11

        |-- trace12

        |-- trace13

        |-- trace14

        |-- trace15

        |-- trace2

        |-- trace3

        |-- trace4

        |-- trace5

        |-- trace6

        |-- trace7

        |-- trace8

        `-- trace9

    

    1 directory, 18 files


1.1.3 Debugfs挂载


    mount  –t debugfs    debugfs /sys/kernel/debug

2. Blktrace和Blkparse的用法:


2.1 参数

  

 2.1.1 blktarce:  

  • -o 指定输出位置,后面带的 - 是标准输出。

  • -d 指定要采集的设备。


 2.1.2 blkparse  

  • -i   指定输入文件

  • -f   指定输出格式(后面讲)


2.2 简单用法

我们用man blkparse时,看到最简单的使用命令就是:

blktrace -d /dev/sda -o - | blkparse -i -

这个命令串是直接把blktrace采集的信息用blkparse分析好打印出来,如果想停止,ctrl+C即可。

如果不这么用,可以去掉-o选项,会打印到当前目录。

当然,我们也可以先让blktarce采集出信息存到磁盘,然后再去分析。

blktrace -d /dev/sda

它会生成一系列sda.blktrace.*的文件,*号位置是数字,对应CPU号。其实和/sys/kernel/debug/block是对应的。然后可以用来读取。

blkparse -i da.blktrace.0

似乎随便指定一个文件,就会读取所有文件来分析。   

2.3 查看报告

在blkio停止时,会打印个简单的统计报告。展示抓取的事件。


使用blkparse主要是查看每个io事件。 


这里面,每行都是一个事件。第六行是大写字母,这是写的类型。

      

blkparse 的-f选项可以定义 。具体可以看man blkparse。格式类似C语言的printf格式。


    –f "%D %2c %8s %5T.%9t %5p %2a %3d "


  1. 8,0 按默认输出对应%D,主从设备号

  2. 1 按默认输出对应%2c,表示cpu id

  3. 27 按默认输出对应%8s,表示序列号,似乎是递增的(序列号是blkparse自己产生的一个序号,实际IO里没有这个号)

  4. 0.000072555 按默认对应%5T.%9t,表示”秒.纳秒”

  5. 1601 对应%5p,表示,进程id,例子中就是[flush-8:0]线程。

  6. Q对应%2a,表示Action,Action表格如下(如Q表示IO handled by request queue code),详细信息看后面的action表

  7. W 对应%3d,表示RWBS域(W表示写操作),各字母含义如下至少包含“RWD“( R 读,W写,D块被忽略)中的1个字符,还可以附加“BS“(B barrier,S同步)

  8. 后面还有 238140576 + 8 <- (8,5) 15316128 ,这个是写入的位置等信息。238140576为(8:0)块设备的起始扇区号,+8说明后面连着8个扇区,(8,5)是它的分区,后面是分区的扇区号。


2.4 锁定IO操作的文件

接着上面第8条数据,我们知道了设备块以及扇区位置。根据这个信息,我们就可以想办法定位到对应的文件

首先我们需要知道的是,扇区和块(簇)的区别。扇区是一个物理硬盘的概念,是物理硬盘读写的最小单位。块是操作系统的概念,操作系统中读写的最小单位。扇区大小标准是512B(其实硬盘的实例扇区大小现在已经是4k,甚至更大,但由于操作系统保留原标准,所以硬盘将其模拟成512B的扇区,这也就带来了4K对齐的问题),操作系统块通常可以自己设定,一般是4K。我们可以这样查看块的大小。

2.4.1 确定块位置

  

    #tune2fs -l /dev/sda5|grep Block

    Block count:              2621184

    Block size:               4096

    Blocks per group:         32768    

    

    可以看出,/dev/sda5的块是4k大小。扇区是512B。相差8倍。回到上面的(8,5),15316128号扇区。我们可以算出它的块号是,15316128/8=1914516


2.4.2 定位inode号

然后我们就可以根据这个定位出inode的位置。

#debugfs -R "icheck 1914516" /dev/sda5

debugfs 1.41.12 (17-May-2010)

BlockInode number

1914516537102

于是我们获得了inode号。

2.4.3 定位文件

根据inode就可以找到对应的文件了。

#find / -inum 537102

然后我们就可以用lsof来找出是哪个进程在操作这个文件

2.5 action表


2.6 统计数据

blkparse最后也会给出个统计数据。


里面的信息会对应每个cpu,以及最后有一个总的统计。


3. 结束

除了blkparse外,seekwatcher也是一个解析工具,只不过它是生成一个图片,对于大多使用命令行运维的Linux而言不是非常方便。


原创粉丝点击