作为一个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. 新浪实时股票数据接口http://hq.sinajs.cn/list=code

    股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据1.1Sina股票数据接口以大秦铁 ...

  2. jquery图表插件morris.js参数详解和highcharts图表插件

    一.morris.js 优点:轻巧.简单好用 缺点:没highcharts功能多,常用的足以 网址:http://morrisjs.github.io/morris.js/ 核心代码 1.head调用 ...

  3. Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义

    转:http://blog.chinaunix.net/uid-26896647-id-3433968.html 问题描述:如果在一个表中的一个字段上存在'&',  '_',  '%'这样的特 ...

  4. Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据

    jquery.tmpl.js 是一个模板js  ,主要有2个方法 (1):$.template()方法,将一段script或者是Html编译为模板,例如 $.template('myTemplate' ...

  5. 事务报错 [Exception] 当前 TransactionScope 已完成

    捕获异常的时候 偶尔会碰到这个异常报告 导致原因 //正确代码 using (TransactionScope ts = new TransactionScope(TransactionScopeOp ...

  6. I.MX6 linux Qt 同时支持Touch、mouse

    /***************************************************************************** * I.MX6 linux Qt 同时支持 ...

  7. LeetCode Number of Islands 岛的数量(DFS,BFS)

    题意:0代表水,1代表陆地,那么被水围起来的就是岛了,给一个01矩阵,问有多少个岛? 思路:DFS还是比较短,实现了一下.如果一个点已经被遍历过了,那就将其置为0就行了,不要去搜0的. class S ...

  8. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  9. HDU 5430 Reflect

    题意:问在一个圆形的镜面里,从任意一点发出一个光源,经n次反射回到起点的情况数是多少. 解法:直接贴题解吧…… 求1至N+1中与N+1互质的个数,即欧拉函数. 代码: #include<stdi ...

  10. C# 类与接口的几个问题的总结(待续)

    1. 有关类的多态性 C#中,类的多态性是通过在子类中重载基类的虚方法(virtual标识)或函数成员来实现. 在C#中,继承.虚方法和重写方法组合在一起才能实现多态性. 2. 显式接口成员的使用 显 ...