0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过对blktrace的输出结果进行分析读、写操作的磁盘块进行I/O频次统计

Linux阅码场 来源:未知 作者:李倩 2018-04-03 09:48 次阅读

如果我们想知道,在一段时间内,那一个磁盘块被读写的频率最高,怎么办?我问这个问题是看到taobao kernel wiki上面有这么一段话,看了我十分心痒:

通过对blktrace的输出结果进行分析,我们可以对特定时间段内发生的读、写操作的磁盘块进行I/O频次统计。结合通过将磁盘块I/O频度统计和page cache命中率统计相结合,就可以比较有效的判断服务器节点的cache使用效率。通过这套工具,CDN系统修正了一个固态硬盘上cache管理的缺陷,显著提高了I/O性能(详细信息)淘宝大神给了一个shell脚本解决这个问题,但是我守着代码,不知道怎么用。就研究了下blktrace和大神的代码。常常听淘宝的霸爷,提起blktrace。iostat,iotop这些的工具也是统计磁盘IO的,也非常有用,但是和blktrace比,信息过于summarized,而blktrace跟踪了发生在块设备层的很多事件,简直就是整个块设备层事件的回放。blktrace能够trace那些事件呢?

上面这个胶片来自HP的介绍blktrace的胶片,介绍的非常好,是参考文献中一篇。 这些事件都会被blktrace 捕捉到。由于这些事件要和kernel代码中block device的work flow一一对应,目前我的功力尚不足,所以我就不一一介绍这些事件了。 blktrace输出的东西,不是文本,是一些特殊的格式,要想可读,需要blkparse解析blktrace的输出。 我们看下blktrace和blkparse合作方式

这是一个比较典型的使用: blktrace -d表示monitor哪个设备,-o -表示讲输出吐出到标准输出。 blkparse -i - 表示从标准输入获取信息,-o 表示讲解析的内容记录在blkparse.out 我们看下输出长的什么样子:

这个胶片非常好的介绍了各个字段的含义。主次设备号,CPU ID,sequence num,time stamp PID ,起始扇区号,进程名字比较好理解,比较难理解的是$6,$7$6中的GPQMDC,一堆字母,代表什么含义?$7的WR 又代表什么含义呢? 一个一个来,对于$6,表示的是event,官方手册给了事件对应表:

那么$7是干嘛的呢? 基本上是R和W,也会出现B和S. R表示是read操作,W表示write操作,B是barrier operation,S是synchronous operation。 看到这个blkparse的输出,我们发现这些更像是raw data,需要我们挖掘背后的信息。btt这个工具就是一个分析输出得到更高层信息的tool,他不是我们本文的重点,我们不提他。 回到开篇的问题,如何知道which磁盘扇区被读写的次数最多?有了blkparse的输出,我们完全可以做到这个统计:淘宝的Coly大神的shell脚本已经帮我们作了这个事情。

root@manu-hacks:~/code/shell/blkstrace_calculator# cat cal.sh

#!/bin/bash

TMP_DIR=".blktrace_cal"

# extend the blktracelogto"blockid R/W"

extend()

{

awk-v max=$2-vmod=$3'{

if(NR%max==mod&&$6=="D"&&(index($7,"R")||index($7,"W"))){

for(i=0;i<$10; i++) {

print $8+i" "substr($7,1,1);

}

}

}'$1|sort-k1-nr>$TMP_DIR/.tmp.$1.$3

touch $TMP_DIR/$3.ok

}

usage()

{

echo"Usage: $1 input_log [parallel_num]"

exit

}

rm-rf $TMP_DIR

mkdir $TMP_DIR

if["$1"==""];then

usage $0

fi

# does input_log exists?

if[!-f $1];then

echo"($1) not exists"

exit

fi

parallel=$2

if["$2"==""];then

parallel=4

fi

echo"[input: $1]"

max=`expr $parallel-1`

files=""

filename=`basename $1`

echo"[run $parallel process]"

foriin`seq 0 $max`

do

extend $filename $parallel $i&

files=$files" $TMP_DIR/.tmp.$filename.$i"

done

echo"processing...."

nr=0

# awk will finishifall*.ok created.

while[$nr-ne"$parallel"]

do

nr=`find $TMP_DIR-maxdepth 1-name"*.ok"|wc-l`

echo-n"."

sleep 1

done

echo""

echo"merge sort"

sort-m-k1-nr $files|uniq-c|sort-k1-nr>tmp

total=`awk'{sum+=$1}END{print sum}'tmp`

awk-v sum=$total'{

print $0"\t"$1*1000/sum;

}'tmp>result

echo"sort finish."

rm-rf $TMP_DIR

这段代码是Coly大神的代码,我无意抄袭前辈,只是晚辈拿来欣赏学习,光荣属于淘宝的Coly前辈。 先说parallel,这个是为了充分利用CPU资源,让多个CPU一起来执行extend。NR%max==mod将一个文件按照行分开,由多个进程分别处理之。不多讲。 extend的含义也比较简单:

20397704是起始扇区,+ 8表示的连续8个扇区都在本次事件之内,也就是说20397704/20397705/20397706..都是本次事件涉及的扇区。 OK,我们看下cal.sh的使用及输出:

当前目录下生成了tmp和result文件:

我们可以看到,扇区号为454375583被访问的次数为39次,占总访问的千分之0.228744。那这个扇区属于拿个文件呢?debugfs就可以来帮忙了.我们以访问27次的264753359扇区为例。扇区是512字节,我的文件系统ext4的块大小是4K,所以根据扇区可以定位的块号,debugfs根据块号,可以定位到inode,再根据inode,就可定位到filename。

我们发现,这个文件被读写的次数最多。谁干的? lsof来帮忙?

我们用Coly大神的脚本和blktrace/blkparse就解决了磁盘块IO访问频率的统计。如果有个别的block被频繁的读取,表示cache的替换效率不高。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    381

    浏览量

    25324
  • 固态硬盘
    +关注

    关注

    12

    文章

    1476

    浏览量

    57635

原文标题:使用blktrace统计磁盘块I/O访问频率

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    如何操作PIC24的I/O输出高低电平

    /O输出方向,x表示端口类别,比如TRISA就是操作A端口输出方向的,TRISx = 0,表示输出;TRISx = 1,表示输入。2.PO
    发表于 11-24 07:30

    如何对RAM进行操作

    如何对RAM进行操作
    发表于 01-18 06:47

    请问GPIO设定为输出的时候进行操作会得到什么结果?

    看了一段模拟I2C的代码,居然是在输出的时候进行,不知道是不是代码写错了.我认为是作者忘记了切换IO状态.但是看到代码这么规整,总不能没有调试过就直接贴上来吧?请教各位大神,GPIO
    发表于 09-15 06:01

    一种高效的磁盘队列I/O机制

    分析了传统磁盘队列的存储管理开销和读写性能,针对磁盘队列I/O已成为影响消息服务器性能的首要瓶颈,提出了一种高效
    发表于 05-14 19:51 32次下载

    播出服务器磁盘I/O与缓存性能分析

    播出服务器磁盘I/O与缓存性能分析:针对电视台专业播出服务器在播出质量和播出性能上的高要求,提出了(s,S)策略下读数据缓存和复用缓存与节目数量、节目数据速率、
    发表于 01-16 15:09 22次下载

    电池管理器件的/操作

    电池管理器件的/操作 Dallas Semiconductor 的电池管理IC 采用相同的通信协议和相同的存储器地址不同类型的存储器可以分别进行
    发表于 04-12 08:50 21次下载

    基于小数据同步的回I/O调度器

    将会导致严重的放大问题,使得系统的I/O性能大幅度降低.为了解决上述问题,提出了一种I/O
    发表于 12-26 18:05 0次下载

    关于标准I/O库执行I/O操作

    当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次
    的头像 发表于 07-01 17:17 2460次阅读

    如何使用QSPI Flash控制器开发板上的 QSPI Flash进行操作

    学习内容 本文首先介绍Flash和QSPI Flash控制器的相关内容,然后使用 QSPI Flash 控制器,开发板上的 QSPI Flash 进行操作
    的头像 发表于 06-10 17:08 1.4w次阅读
    如何使用QSPI Flash控制器开发板上的 QSPI Flash<b class='flag-5'>进行</b><b class='flag-5'>写</b><b class='flag-5'>读</b><b class='flag-5'>操作</b>

    PIC24HJ128GP506A I/O,定时器中断操作

    /O输出方向,x表示端口类别,比如TRISA就是操作A端口输出方向的,TRISx = 0,表示输出;TRISx = 1,表示输入。2.PO
    发表于 11-16 16:06 3次下载
    PIC24HJ128GP506A <b class='flag-5'>I</b>/<b class='flag-5'>O</b>,定时器中断<b class='flag-5'>操作</b>

    Linux磁盘I/O的性能指标和查看性能工具

    在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 Linux 磁盘 I/O 的工
    的头像 发表于 05-14 15:21 2729次阅读

    使用System IO Ports SerialPort进行串行/

    电子发烧友网站提供《使用System IO Ports SerialPort进行串行/.zip》资料免费下载
    发表于 11-21 09:56 0次下载
    使用System IO Ports SerialPort<b class='flag-5'>进行</b>串行<b class='flag-5'>读</b>/<b class='flag-5'>写</b>

    为什么异步fifo中地址同步在时钟域时序分析通过

    为什么异步fifo中地址同步在时钟域时序分析通过? 异步FIFO中地址同步在时钟域时序
    的头像 发表于 10-18 15:23 837次阅读

    Linux系统下I/O操作讲解

    Linux系统下I/O 一、I/O简介 I/O(输入/输出
    的头像 发表于 11-08 15:13 1378次阅读
    Linux系统下<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>操作</b>讲解

    磁盘I/O是怎么工作的

    同前面讲述的CPU、内存一样,文件系统和磁盘I/O,也是Linux操作系统最核心的功能。 磁盘为系统提供了最基本的持久化存储。 文件系统则在
    的头像 发表于 11-13 11:20 1132次阅读
    <b class='flag-5'>磁盘</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>是怎么工作的