iostat研究

1.     追踪iostat是从哪里得到IO相关信息

Shell>strace-eopen iostat

open("/etc/ld.so.cache",O_RDONLY)      = 3

open("/lib64/libc.so.6",O_RDONLY)      = 3

open("/usr/lib/locale/locale-archive",O_RDONLY) = 3

open("/usr/share/locale/locale.alias",O_RDONLY) = 3

open("/usr/lib/locale/CH/LC_MESSAGES",O_RDONLY) = -1 ENOENT (No such file or directory)

open("/usr/lib/locale/CH/LC_CTYPE",O_RDONLY) = -1 ENOENT (No such file or directory)

open("/usr/lib/locale/CH/LC_TIME",O_RDONLY) = -1 ENOENT (No such file or directory)

open("/usr/lib/locale/CH/LC_NUMERIC",O_RDONLY) = -1 ENOENT (No such file or directory)

open("/sys/devices/system/cpu",O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 3

open("/proc/diskstats",O_RDONLY)       = 3//获取磁盘状态

open("/etc/localtime",O_RDONLY)        = 3//时钟设置文件,是/usr/share/zoneinfo目录下对应文件的符号连接

open("/proc/stat",O_RDONLY)            = 3//cpu的状态

open("/proc/diskstats",O_RDONLY)       = 3//磁盘的状态

 

对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions,而对于kernel 2.6, 数据主要来自/proc/diskstats或者/sys/block/[block-device-name]/stat

 

2.     iostat 结果解析

iostat 第一次显示的是从开机到现在的平均状态

 

Device: rrqm/s  wrqm/s  r/s w/s  rsec/s  wsec/s rkB/s  wkB/s  avgrq-sz avgqu-sz  await  svctm%util
/dev/hda 1.70  1.70   0.82  0.82 19.88  20.22  9.94  10.11  24.50   11.83  57.81  610.76  99.96

rrqm/s: 每秒进行 merge 的读操作数目。即delta(rmerge)/s
wrqm/s:
每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s:
每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s:
每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s:
每秒读扇区数。即 delta(rsect)/s
wsec/s:
每秒写扇区数。即 delta(wsect)/s
rkB/s:
每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:
平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm:
平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
delta(use)/s/1000 (因为use的单位为毫秒)

如果%util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。

举个简单易理解的例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当
是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人
购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队
排了。还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的
等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人
去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情
比排队要有意义 (不过我还没发现什么事情比排队还无聊的)

I/O 系统也和超市排队有很多类似之处:

 

r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (util)类似于收款台前有人排队的时间比例。

 

我们可以根据io操作率或者平均队列长度来大体判断磁盘的繁忙程度

 

3.      /proc/diskstats信息分析

user_00@xxxxxx64:~> cat /proc/diskstats
   1    0 ram0 0 0 0 0 0 0 0 0 0 0 0
   1    1 ram1 0 0 0 0 0 0 0 0 0 0 0
   1    2 ram2 0 0 0 0 0 0 0 0 0 0 0
   1    3 ram3 0 0 0 0 0 0 0 0 0 0 0
   1    4 ram4 0 0 0 0 0 0 0 0 0 0 0
   1    5 ram5 0 0 0 0 0 0 0 0 0 0 0
   1    6 ram6 0 0 0 0 0 0 0 0 0 0 0
   1    7 ram7 0 0 0 0 0 0 0 0 0 0 0
   1    8 ram8 0 0 0 0 0 0 0 0 0 0 0
   1    9 ram9 0 0 0 0 0 0 0 0 0 0 0
   1   10 ram10 0 0 0 0 0 0 0 0 0 0 0
   1   11 ram11 0 0 0 0 0 0 0 0 0 0 0
   1   12 ram12 0 0 0 0 0 0 0 0 0 0 0
   1   13 ram13 0 0 0 0 0 0 0 0 0 0 0
   1   14 ram14 0 0 0 0 0 0 0 0 0 0 0
   1   15 ram15 0 0 0 0 0 0 0 0 0 0 0
   7    0 loop0 0 0 0 0 0 0 0 0 0 0 0
   7    1 loop1 0 0 0 0 0 0 0 0 0 0 0
   7    2 loop2 0 0 0 0 0 0 0 0 0 0 0
   7    3 loop3 0 0 0 0 0 0 0 0 0 0 0
   7    4 loop4 0 0 0 0 0 0 0 0 0 0 0
   7    5 loop5 0 0 0 0 0 0 0 0 0 0 0
   7    6 loop6 0 0 0 0 0 0 0 0 0 0 0
   7    7 loop7 0 0 0 0 0 0 0 0 0 0 0
   8    0 sda 30526 20091087215 193416 115412736 102258023 1811485376 87116184 0 18093240 87295592
   8    1 sda1 22754 483028 5686677 45493256
   8    2 sda2 166 662 8265 66120
   8    3 sda3 6528 570989 123499806 987893792
   8    4 sda4 2887 30896 88516083 708124240

   9    0 md0 0 0 0 0 0 00 0 0 0 0

 

这个命令用于显示磁盘、分区和统计信息:sda为整个硬盘的统计信息,sda1为第一个分区的统计信息,sda2为第二个分区的统计信息。

ramdisk设备为通过软件将RAM当做硬盘来使用的一项技术。

 

user_00@xxxxxx64:~> cat  /sys/block/sda/stat

30537     2009 1087303   193476 115421945 102267776 181164050487122648        0 18094108 87302116

 

/proc/diskstats文件比/sys/block/sda/stat文件多3个域,从左至右分别对应主设备号,次设备号和设备名称。后续的11个域在这两个文件里是相同的,它们的函义将在下面解释。除了第9个域,所有的域都是从启动时的累积值。

1个域:读完成次数 ----- 读磁盘的次数,成功完成读的总次数。

number of issued reads. This is the total number of reads completedsuccessfully.

2个域:合并读完成次数,第6个域:合并写完成次数。为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。

number of reads merged
3个域:读扇区的次数,成功读过的扇区总次数。

number of sectors read. This is the total number of sectors readsuccessfully.

4个域:读花费的毫秒数,这是所有读操作所花费的毫秒数(用__make_request()end_that_request_last()测量)。
number of milliseconds spent reading. This is the total number ofmilliseconds spent by all reads (as measured from __make_request() toend_that_request_last()).

5个域:写完成次数 ----写完成的次数,成功写完成的总次数。

number of writes completed. This is the total number of writes completedsuccessfully.

6个域:合并写完成次数 -----合并写次数。

number of writes merged Reads and writes which are adjacent to each othermay be merged for efficiency. Thus two 4K reads may become one 8K read beforeit is ultimately handed to the disk, and so it will be counted (and queued) asonly one I/O. This field lets you know how often this was done.

7个域:写扇区次数 ---- 写扇区的次数,成功写扇区总次数。

number of sectors written. This is the total number of sectors writtensuccessfully.

8个域:写操作花费的毫秒数  ---  写花费的毫秒数,这是所有写操作所花费的毫秒数(用__make_request()end_that_request_last()测量)。

number of milliseconds spent writing This is the total number ofmilliseconds spent by all writes (as measured from __make_request() toend_that_request_last()).

9个域:正在处理的输入/输出请求数 -- -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。

number of I/Os currently in progress. The only field that should go tozero. Incremented as requests are given to appropriate request_queue_t anddecremented as they finish.
10个域:输入/输出操作花费的毫秒数  ----花在I/O操作上的毫秒数,这个域会增长只要field 9不为0

number of milliseconds spent doing I/Os. This field is increased so longas field 9 is nonzero.

11个域:输入/输出操作花费的加权毫秒数 -----  加权,花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。

number of milliseconds spent doing I/Os. This field is incremented at eachI/O start, I/O completion, I/O merge, or read of these stats by the number ofI/Os in progress (field 9) times the number of milliseconds spent doing I/Osince the last update of this field. This can provide an easy measure of bothI/O completion time and the backlog that may be accumulating.

 

11个域分别用如下变量表明:

rd_ios;//读完成次数

rd_merges_or_rd_sec;//合并读完成次数

rd_sec_or_wr_ios;//读扇区的次数,成功读过的扇区总次数

rd_ticks_or_wr_sec;//读花费的毫秒数,这是所有读操作所花费的毫秒数

wr_ios;//写完成次数

wr_merges;//合并写完成次数

wr_sec;//写扇区的次数,成功写扇区总次数

wr_ticks;//所有写操作所花费的毫秒数(

ios_pgr;//正在处理的输入/输出请求数 -只有这个域应该是0

tot_ticks;//:输入/输出操作花费的毫秒数

rq_ticks;//输入/输出操作花费的加权毫秒数

 

 

上面我们说可以根据io操作率或者平均队列长度来大体判断磁盘的繁忙程度

假如我们1秒钟统计一次

Iostat源码中对io操作率的计算公式为:

(后1秒的tot_ticks —前1秒的tot_ticks/时间间隔*HZ

时间间隔是从/proc/uptime文件中读取计算相隔1秒的差值

HZ是每秒钟的时钟滴答数,是用sysconf(_SC_CLK_TCK)获取到的

平均队列长度的计算公式:

平均队列长度=

1秒后的(rd_sec_or_wr_ios+ wr_sec)— 1秒前的(rd_sec_or_wr_ios+wr_sec))/

(1秒后的(rd_ios+ wr_ios)—1秒前的(rd_ios+ wr_ios)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值