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

iostat

iostat的功能异常强大,输出项也特别多,比如下面这个例子:

  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. 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

其各项的含义分别是:

  • 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系统已经满负荷,该磁盘可能存在瓶颈。

idle小于70% IO压力就较大了,一般读取速度有较多的wait。

同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高),另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。

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

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

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

有时间的话,我会单独写几个帖子来说说iostat。

iodump

iodump 是一个统计每一个进程(线程)所消耗的磁盘I/O工具。这个一个perl脚本,其原理时打开有关I/O的内核记录消息开关,而后读取消息然后分析输出。简单使用步骤如下:

首先下载这个工具:

  1. wget http://aspersa.googlecode.com/svn/trunk/iodump

然后打开有关I/O内核消息的开关:

  1. echo 1 >/proc/sys/vm/block_dump

上述开关打开后,内核会记录下每一个I/O操作的消息。我们只需要定时获取并分析就好了,比如下面这样:

  1. while true; do sleep 1; dmesg -c ; done |perl iodump

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

  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

上述输出的单位为块(block),每块的大小取决于创建文件系统时指定的块大小。比如我这个里的sda7的block大小是1KB。

iotop

iotop是一个Python编写的工具,有类似top工具的UI,包括一些参数也和top类似。不过它对系统有一些要求,分别是:

  1. Python ≥ 2.5 or Python ≥ 2.4 with the ctypes module
  2. Kernel ≥ 2.6.20
  3. Kernel uses options:
  4. TASK_DELAY_ACCT
  5. CONFIG_TASKSTATS
  6. TASK_IO_ACCOUNTING
  7. CONFIG_VM_EVENT_COUNTERS

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

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

  1. sudo apt-get install iotop

即可(不得不说,Debian系统提供的软件真的是相当丰富呀),其他系统则可以通过下面的指令下载源代码,然后编译

  1. git clone git://repo.or.cz/iotop.git

具体的使用方法可以参考iotop(8)手册,下面是在我机器上的一个显示:

  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

iopp

iopp是另外一个统计每一个进程I/O的工具,使用C语言编写,理论上应该比上述两个重狙效率都要高。

安装方法很简单,首先通过下面的指令下载源代码:

  1. git://github.com/markwkm/iopp.git

然后分别通过下面的指令编译安装:

  1. cmake CMakeLists.txt
  2. make
  3. make install DESTDIR=/usr

下面是一个使用例子:

  1. iopp -i -c 2
  2. pid rchar wchar syscr syscw rbytes wbytes cwbytes command
  3. 2144 0 296 40 8 0 0 0 /usr/sbin/LCDd
  4. 2284 0 0 2 0 0 0 0 ha_logd: read process
  5. 2299 0 0 2 0 0 0 0 ha_logd: write process
  6. 2520 3 3 3 3 0 0 0 /usr/lib/virtualbox/vboxwebsrv
  7. 2599 2 2 2 2 0 0 0 /usr/lib/virtualbox/VBoxSVC
  8. 2675 0 0 1 0 0 0 0 runsvdir
  9. 3177 16 16 4 2 0 0 0 /usr/bin/gnome-shell
  10. 3192 16 16 4 2 0 0 0 nautilus
  11. 3305 180 340 100 60 0 0 0 /usr/lib/icedove/icedove-bin
  12. 3623 1393 1440 1  1 0 0 0 sshd: wgzhao@pts/0
  13. 4305 0  4603904   0 562 0  4603904 0 postgres: writer process
  14. 6257 2064384 1892352 252 215 3719168 139264 0 postgres: wgzhao pgbench [local] UPDATE

上述输出的各项含义是:

  • pid 进程ID
  • rchar 将要从磁盘读取的字节数
  • wchar 已经写入或应该要写入磁盘的字节数
  • syscr 读I/O数
  • syscw 写I/O数
  • rbytes 真正从磁盘读取的字节数
  • wbytes 真正写入到磁盘的字节数
  • cwbytes 因为清空页面缓存而导致没有发生操作的字节数
  • command 执行的命令

其中rbytes,wbytes,cwbytes会因给出-k或者-m参数,而显示为rkb,wkb,cwkb或rmb,wmb,cwmb。command一列如果给出-c的参数则显示完整的命令名而不仅仅只是命令本身。

这些参数的使用和top类似。

更具体的可以参考iopp(8)手册。

dstat

dstat 号称各种资源统计工具,其目的是想替代vmstat,iostat,netstat,ifstat等各种单一统计工具,从而做到All in one。 dstat用Python语言编写。

dstat能够清晰显示每列的信息,特别是单位及大小很明确,不会在单位换算上犯迷糊和失误。最重要的是,因为它是基于模块化设计,因此我们可以很容易的写一个插件来收集我们需要的统计信息。

另外,dstat的输出还可以导出为CSV格式文件,从而可以在电子表格工具里分方便的生成统计图形。

目前dstat的插件已经相当多了,这是我机器上目前的输出:

  1. $ dstat  --list
  2. internal:
  3. aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net,
  4. page, page24, proc, raw, socket, swap, swapold, sys, tcp, time, udp, unix, vm
  5. /usr/share/dstat:
  6. battery, battery-remain, cpufreq, dbus, disk-tps, disk-util, dstat, dstat-cpu, dstat-ctxt,
  7. dstat-mem, fan, freespace, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre,
  8. memcache-hits, mysql-io, mysql-keys, mysql5-cmds, mysql5-io, mysql5-keys, net-packets, nfs3,
  9. nfs3-ops, nfsd3, nfsd3-ops, ntp, postfix, power, proc-count, qmail, rpc, rpcd, sendmail, snooze,
  10. squid, test, thermal, top-bio, top-bio-adv, top-childwait, top-cpu, top-cpu-adv, top-cputime,
  11. top-cputime-avg, top-int, top-io, top-io-adv, top-latency, top-latency-avg, top-mem, top-oom, utmp,
  12. vm-memctl, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi

下面给出几个使用的列子(实际输出是带彩色的,很容易识别)

dstat的缺省输出:

  1. wgzhao-nb:~# dstat
  2. You did not select any stats, using -cdngy by default.
  3. ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
  4. usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  5. 2   1  87  10   0   0| 816k  385k|   0     0 |   0 0 |2279  7048
  6. 5   1  78  16   0   0|2600k    0 | 140B  940B|   0 0 |5952    13k
  7. 5   3  80  12   0   0|2896k  182k|  70B  358B|   0 0 |6074    14k
  8. 4   2  78  16   0   0|2724k    0 |  70B  374B|   0 0 |5703    15k
  9. 4   2  81  14   0   0|3008k    0 |  70B  358B|   0 0 |5924    13k
  10. 5   1  80  14   0   0|1976k   17k|  70B  358B|   0 0 |5819    13k
  11. 5   2  79  14   0   0|2056k    0 | 198B  374B|   0 0 |5618    13k
  12. 4   2  79  15   0   0|2416k    0 |  70B  358B|   0 0 |5866    15k
  13. 5   2  78  15   0   0|2528k    0 |  70B  358B|   0 0 |6356    14k
  14. 5   2  78  16   0   0|2288k    0 |  70B  358B|   0 0 |6515    15k
  15. 5   2  79  14   0   0|2656k 8192B|  70B  358B|   0 0 |6490    15k
  16. 3   2  81  13   0   0|2296k    0 |  70B  374B|   0 0 |5573    15k
  17. 4   3  76  17   0   1|2224k    0 |  70B  358B|   0 0 |5366    12k
  18. 5   1  81  13   0   0|2208k    0 | 508B  358B|   0 0 |5403    13k
  19. 4   2  79  15   0   0|2024k  182k|  70B  358B|   0 0 |5583    13k
  20. 5   2  79  15   0   0|2148k   17k| 186B  490B|   0 0 |5400    12k

指定需要显示的列:

  1. wgzhao-nb:~# dstat  -c --top-cpu -d --top-bio --top-latency
  2. Module dstat_top_latency failed to load. (Kernel has no scheduler statistics, use at least 2.6.12)
  3. ----total-cpu-usage---- -most-expensive- -dsk/total- ----most-expensive----
  4. usr sys idl wai hiq siq|  cpu process   | read  writ|  block i/o process
  5. 2 1  87  10 0 0|gnome-shell  0.7| 826k  384k|postgres 692k   52k
  6. 4 2  79  16 0 0|postgres: wgz3.0|1744k  776k|postgres: w1744k 72k
  7. 5 3  78  15 0 0|postgres: wgz5.0|3120k  0 |postgres: w3064k  136k
  8. 6 2  73  19 0 0|postgres: wgz4.2|2608k  285k|postgres: w2608k 136k
  9. 4 2  77  17 0 0|postgres: wgz3.5|2112k  848k|postgres: w2112k 88k
  10. 3 2  71  25 0 0|postgres: wgz2.0| 944k 1049k|postgres: w 936k 48k
  11. 3 2  58  37 0 0|postgres: wgz2.0| 920k 2070k|postgres: w 928k 64k
  12. 3 2  62  34 0 0|postgres: wgz2.2|1496k  992k|postgres: w1608k 72k
  13. 3 2  56  38 0 0|postgres: wgz3.0|1840k  645k|postgres: w1856k 88k
  14. 3 2  78  17 0 0|postgres: wgz3.0|1420k 1200k|postgres: w1292k 80k
  15. 5 2  80  12 0 1|postgres: wgz4.2|2628k 0 |postgres: w2636k  112k
  16. 4 3  69  25 0 0|postgres: wgz3.8|2168k  576k|postgres: w2224k 104k

指定需要显示的列,并同时将结果导出到文件:

  1. wgzhao-nb:~# dstat  --disk --mem --proc --io --sys --filesystem --tcp --vm --output dstat.csv
  2. -dsk/total- ------memory-usage----- ---procs--- --io/total- ---system-- --filesystem- ----tcp-sockets---- -----virtual-memory----
  3. read  writ| used  buff  cach  free|run blk new| read  writ| int   sw |files  inodes|lis act syn tim clo|majpf minpf alloc  free
  4. 844k  404k| 829M 19.4M 2920M  124M|  0 0.0 0.7|47.5  38.4 |2336  7185 | 4928  12286 | 11   3   0   0   2|   1   620   602   605
  5. 2128k 1526k| 828M 19.4M 2915M  130M|  0 2.0   0| 111   157 |4588    14k| 4928  12285 | 11   3   0   0   2|  0  1859   995  2278
  6. 920k 2151k| 826M 19.4M 2917M  129M|  0 2.0   0|52.0   237 |3091  7540 | 4928  12284 | 11   3   0   0   2|   0  4448  2330  2144
  7. 2124k 1003k| 826M 19.4M 2921M  126M|1.0 1.0   0| 135   106 |4705    14k| 4928  12284 | 11   3   0   0   2|  0   331   865    1
  8. 2344k 1024k| 826M 19.4M 2924M  122M|1.0 2.0   0| 121   118 |4074    13k| 4928  12284 | 11   3   0   0   2|  0   249   953    1
  9. 1572k 1624k| 827M 19.4M 2926M  120M|1.0 2.0   0|87.0   190 |3231    11k| 4928  12284 | 11   3   0   0   2|  0    98   530    1
  10. 916k  788k| 827M 19.4M 2928M  119M|  0 2.0   0|68.0  92.0 |3452  8709 | 4928  12284 | 11   3   0   0   2|   0   128   383    4
  11. 2452k 1665k| 826M 19.4M 2931M  116M|1.0 1.0   0| 132   197 |4779    14k| 4928  12284 | 11   3   0   0   2|  0   208   822    1
  12. 1552k 1328k| 827M 19.4M 2933M  114M|  0 2.0   0|97.0   156 |3762  9117 | 4928  12284 | 11   3   0   0   2|  0   133   473    1
  13. 1192k 2024k| 827M 19.4M 2934M  112M|  0 2.0   0|81.0   239 |4068    11k| 4928  12284 | 11   3   0   0   2|  0   135   414    2
  14. 2668k  584k| 827M 19.4M 2937M  109M|  0 2.0   0| 148  71.0 |4415    10k| 4928  12284 | 11   3   0   0   2|  0   174   870    4
  15. 1712k  960k| 827M 19.4M 2940M  106M|  0 2.0   0| 122   113 |4454    14k| 4928  12284 | 11   3   0   0   2|  0   182   616    2

更详细的用法,可以参考dstat(1)手册。

Linux系统管理员应该了解的一些I/O统计工具的更多相关文章

  1. Linux系统管理员不可不知的命令:sudo

    对Linux系统管理员或高级用户而言,sudo是必不可少的最重要的命令之一.当我们想要运行重要任务时,sudo提供了安全的提升权限.请耐心读本文,看看sudo能为你做些什么. sudo是个统管一切的命 ...

  2. Linux系统管理员:不要害怕升级内核

    Linux系统管理员平时很重要的一项工作就是负责系统内核升级.做好系统内核的升级工作,对于Linux系 统的稳定性具有至关重要的作用.但是很少有人敢贸然的对Linux系统的内核进行升级,担心会影响现有 ...

  3. Linux系统管理员必备的监控工具(88款)

    随着互联网行业的不断发展,各种监控工具多得不可胜数.这里列出网上最全的监控工具.让你可以拥有超过80种方式来管理你的机器.在本文中,我们主要包括以下方面: 命令行工具 网络相关内容 系统相关的监控工具 ...

  4. 观文章《Linux系统管理员修炼三层次》有感

     层次,都不陌生,通俗讲,就是和档次挂钩的,初入江湖时,都想自己几年后,武艺精深,深藏百技,忙时带领团队打BOSS,闲时喝酒论道,博古纵今,想想都令人精神满满,干劲十足!!! 至今已入江湖几载,回首来 ...

  5. Linux系统管理员命令:sudo

    sudo是个统管一切的命令.它的字面意思是代表“超级用户才能做!”(super user do!)对Linux系统管理员或高级用户而言,它是必不可少的最重要的命令之一.你可曾有过这样的经历:在终端中试 ...

  6. Linux系统管理员必备参考资料下载汇总

    Linux系统管理员必备: Linux系统管理工具包系列汇总 Linux系统管理员必看 VanDyke SecureCRT 6.1.3 附特别文件 鸟哥的Linux私房菜 基础学习篇 (第二版) 高清 ...

  7. linux系统管理员 第五部分 1认识系统服务

    linux系统管理员 一 认识系统服务 二认识与分析登录文件 三启动流程.模组管理与loader 四网络设定与备份策略 五软件的安装  源代码与tarball 六软件的安装rpm   srpm与yum ...

  8. 第五部分 linux系统管理员 开机流程 模组管理 与loader

    第五部分   linux系统管理员  开机流程  模组管理  与loader   开机流程分析 cmos保存电脑硬件的参数 bios 基本的输入输出系统  读取硬件的软件 MBR  master bo ...

  9. Linux网络统计工具/命令

    我在Linux(基于CentOS 或者 Debian 的发行版)中该如何查看当前网络端口吞吐量的统计信息?在Linux操作系统中如何查看当前内核snmp计数器以及网络端口的统计信息? 你可以使用以下任 ...

随机推荐

  1. linux下对符合条件的文件大小做汇总统计的简单命令

    (1)统计当前目录下的 *txt 文件du -c -h *txt   (2)统计当前目录下的 *txt 文件, 并求出总大小du  *txt |awk 'BEGIN{count=0;size=0;} ...

  2. JS对象基础

    JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 访问对象的属性 属性是与对象相关的值. 访 ...

  3. bzoj1297: [SCOI2009]迷路

    矩阵. 一个图的邻接矩阵的m次幂相当于 长度恰好为m的路径数.这要求边权为1. 因为边权小于等于9,所以可以把一个点拆成9的点. 拆成的第(i+1)个点向第i个点连边. 如果存在边(u,v,w) 就由 ...

  4. Spring MVC定义拦截器

    拦截器: package sy.Interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http ...

  5. POJ 1276 (多重背包) Cash Machine

    题意: 有n种纸币,已知每种纸币的面值和数量,求所能凑成的不超过cash的最大总面值. 分析: 这道题自己写了一下TLE了,好可耻.. 找了份比较简洁的代码抄过来了..poj1276 #include ...

  6. [转] 搜索之双向BFS

    转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx 如果目标也已知的话,用双向BFS能很大程度上提高速度. 单向时,是 b^le ...

  7. ListView 点击某一项换背景图片

    1. layout_search_list_item.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  8. IOS cocos2d笔记1

    结点添加.删除.获取1.结点:CCNode * childNode = [CCNode node]; 2.加入结点[myNode addChild:childNode z:0 tag:123];//z ...

  9. H264 帧结构分析、帧判断

    http://blog.csdn.net/dxpqxb/article/details/7631304 H264以NALU(NAL unit)为单位来支持编码数据在基于分组交换技术网络中传输. NAL ...

  10. Memcache应用场景介绍,说明

    面临的问题 对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的边 ...