Linux下的一些I/O统计工具-1

上一篇 / 下一篇  2012-08-29 09:43:20 / 个人分类:Linux

L*W.| ?6o7bQ0  作为一个Linux系统管理员,统计各类IO是一项必不可少的工作。其统计工具中iostat显然又是最重要的一个统计手段。但是这里iostat不是本文的重点,因为这个工具的使用在网络上已经有大量的教程,可以供大家参考。这里主要是想介绍一些其他统计工具以来满足不同的需求。

7~4|&Mf vw,Ux4s051Testing软件测试网1bS+OXj+B

  iostat51Testing软件测试网&awz5k/{ T4l3Va

^#SS&]h1L~0  iostat的功能异常强大,输出项也特别多,比如下面这个例子:

#` yS8h#g [*B}0V0
  1. Device: rrqm/s  wrqm/s  r/s     w/s    rkB/s    wkB/s    avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  2. 51Testing软件测试网K|6]0wBhE0u)^6a
  3. sda     0.00     0.50  173.50   73.50  3076.00   604.00    29.80   149.93    676.58   74.36 2098.15  4.05 100.00
51Testing软件测试网D:f$`r,[yE}

  其各项的含义分别是:51Testing软件测试网}#K!cWh\c

.kv |]4HkY8d0  ●rrqm/s:每秒进行merge的读操作数目。即delta(rmerge)/s

]zzdK:^u!^&l%|0

~hY%`t7d c0  ●wrqm/s:每秒进行merge的写操作数目。即delta(wmerge)/s51Testing软件测试网cE1T G9G%to

51Testing软件测试网#N0O8\;s9L7|#Y

  ●r/s:每秒完成的读I/O设备次数。即delta(rio)/s51Testing软件测试网Y,d$` fF1G%x9tL

t(? WR*lr SiS!v0  ●w/s:每秒完成的写I/O设备次数。即delta(wio)/s

GA%Y$rov:j[1|051Testing软件测试网}-aE/V` w

  ●rsec/s:每秒读扇区数。即delta(rsect)/s

tW2S6W#PD1Vf[&_051Testing软件测试网*m5@5Q1F3f(A8V

  ●wsec/s:每秒写扇区数。即delta(wsect)/s51Testing软件测试网[j9Wu]S

1X#qr7P9}cp0  ●rkB/s:每秒读K字节数。是rsect/s的一半,因为每扇区大小为512字节。(需要计算)51Testing软件测试网n Z~6R([w

51Testing软件测试网4~7X)~?,[Sdf

  ●wkB/s:每秒写K字节数。是wsect/s的一半。(需要计算)51Testing软件测试网sUu [.Zo9cEA

51Testing软件测试网6LI l5\!U-i1pE

  ●avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。delta(rsect+wsect)/delta(rio+wio)

kI]'g-MS+Iv051Testing软件测试网 ]1a m-m#{R!@.ig

  ●avgqu-sz:平均I/O队列长度。即delta(aveq)/s/1000(因为aveq的单位为毫秒)。

E"\T*\(|lw e051Testing软件测试网,|W(KM@(W1v

  ●await:平均每次设备I/O操作的等待时间(毫秒)。即delta(ruse+wuse)/delta(rio+wio)

9La\'k;o051Testing软件测试网7jb1DS$cq:|,_

  ●svctm:平均每次设备I/O操作的服务时间(毫秒)。即delta(use)/delta(rio+wio)

W%W&nu#d;DO \051Testing软件测试网+b#LExG*mU/sh4_iA

  ●%util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。即delta(use)/s/1000(因为use的单位为毫秒)51Testing软件测试网 oL A$b-F4vf

51Testing软件测试网,~ z3FCVj4T.~(}I

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

Owv` OK)]2Xk ^(F051Testing软件测试网 L1sD0g;m:\}0L$`

  idle小于70% IO压力就较大了,一般读取速度有较多的wait。51Testing软件测试网:G Z*m g7OY W*l?

51Testing软件测试网~8qwr6`P@3w it

  同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)51Testing软件测试网G#G,Mj|-d z/Y

[)r1P.u%_*U0  另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。

m%@)z\0|f051Testing软件测试网7{C f3Z5p P;{oz!DH5a&q

   avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz ×( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。51Testing软件测试网^tD&fp8O?ZS4c

s"ao6bd*_ i.P0  svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。51Testing软件测试网'XJd@*J

X7ZU4IS0  队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

&c1CP(_{0

Cc%oZe/M-S0Qb#n+C(N0  有时间的话,我会单独写几个帖子来说说iostat。51Testing软件测试网bG.xa9Q

wuw Q#D0  iodump51Testing软件测试网p @}2{!q+T ]dq[

51Testing软件测试网&HuTH[

  iodump 是一个统计每一个进程(线程)所消耗的磁盘I/O工具。这个一个perl脚本,其原理时打开有关I/O的内核记录消息开关,而后读取消息然后分析输出。简单使用步骤如下:51Testing软件测试网5b{;|8o^%QG+J

51Testing软件测试网4zE7G D9[gj7s

  首先下载这个工具:51Testing软件测试网Z D!yR*M*TJ;J H

0N.?/eSx-{6dm d y0  wget http://aspersa.googlecode.com/svn/trunk/iodump

_C _%H4X#u v'[0

c-u Q nm0  然后打开有关I/O内核消息的开关:51Testing软件测试网 }'M:Z ~]mY-F9Z%CQ

51Testing软件测试网P!}0jF+H

  echo 1 >/proc/sys/vm/block_dump

(`6Q? q#M0

u\)l [`f)Xtx0  上述开关打开后,内核会记录下每一个I/O操作的消息。我们只需要定时获取并分析就好了,比如下面这样:51Testing软件测试网2vJD-Z R[Mg:J

)a7Y`XvQWG0  while true;do sleep 1;dmesg -c ; done |perl iodump

-lD5kpHe0J051Testing软件测试网ag*T9l cZ])Z3n&I

  等待一段时间,然后通过ctrl+c来结束上述脚本,你将获得下面类似的信息:

*R&EpHo0

phzO)y!D0

9i bg!j7Y:t!j~i0
  1. TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES  
  2. postgres              5799       1919       1919          0          0 sda7  
  3. jbd2/sda7-8           1572         35          0         35          0 sda7  
  4. jbd2/sda2-8            250         32          0         32          0 sda2  
  5. flush-8:0             2229         31          0         31          0 sda2, sda7  
  6. postgres              4308          2          0          2          0 sda7  
  7. bash                  5804          1          0          1          0 sda2

{ X:x;L R s-k'r0  上述输出的单位为块(block),每块的大小取决于创建文件系统时指定的块大小。比如我这个里的sda7的block大小是1KB。

1ad.J$im4TY051Testing软件测试网4Z*Cjl8J6@

  iotop

@s:\6hj.Z P t0

F ^ } d@ ^3I'z ~#[+O G0  iotop是一个Python编写的工具,有类似top工具的UI,包括一些参数也和top类似。不过它对系统有一些要求,分别是:

q+d&p.x j.|t0

2UVqKE0Em!b0  1、Python ≥ 2.5 or Python ≥ 2.4 with the ctypes module

gq"P,Y ~!]@R0

-DJ_*D'] L#_0  2、Kernel ≥ 2.6.2051Testing软件测试网7MaUR7s

:z7N(lH9m%VZ"csn^0  3、Kernel uses options:51Testing软件测试网orQ j@T/~

51Testing软件测试网N;@c;g%cMd y;_0?

    1)TASK_DELAY_ACCT

{+U|)o~!XK051Testing软件测试网8`3v(Tpk f9ns8W3r

    2)CONFIG_TASKSTATS

$|4NCTb3bu0

:~1oaIU0    3)TASK_IO_ACCOUNTING

0v5LMWH0GV051Testing软件测试网 S-O*mr` |:A

    4)CONFIG_VM_EVENT_COUNTERS51Testing软件测试网eOG!J\

^/zj#k5J0  如果是基于RPM包的系统,可以直接下载编译好的二进制包(here)或者二进制源代码包(here)

k"P,s4Kxp U051Testing软件测试网s3F+G%A!J`|.K9U!BA)]3O

  如果是Debian/Ubuntu系统,直接使用

|_k:Fj1Ny,] EI,EO051Testing软件测试网D9{+X {s'p)\.k

  sudo apt-get install iotop51Testing软件测试网'c[%}!^i]4E I

7[_)g&c B;R#I0  即可(不得不说,Debian系统提供的软件真的是相当丰富呀),其他系统则可以通过下面的指令下载源代码,然后编译51Testing软件测试网5|OVP-jG Vf&j

1hf"C4V|2GoS-w|"]0  git clone git://repo.or.cz/iotop.git

*MLqg1J*E J0

0n#z/caI0  具体的使用方法可以参考iotop(8)手册,下面是在我机器上的一个显示:51Testing软件测试网5|9Bu!^]}:Q

51Testing软件测试网#{ B'?U5QC

51Testing软件测试网 u3h.do8p

  1. iotop -o -u wgzhao  
  2. Total DISK READ:       2.15 M/s | Total DISK WRITE:    1601.15 K/s  
  3.   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND  
  4.  5984 be/4 wgzhao      2.15 M/s   70.55 K/s  0.00 % 83.67 % postgres: wgzhao pgbench [local] UPDATE  
  5.  4305 be/4 wgzhao      0.00 B/s  227.34 K/s  0.00 %  0.00 % postgres: writer process  
  6.  4308 be/4 wgzhao      0.00 B/s   90.15 K/s  0.00 %  0.00 % postgres: stats collector process

TAG:

 

评分:0

我来说两句

Open Toolbar