Linux下的一些I/O統(tǒng)計(jì)工具(1)
作為一個(gè)Linux系統(tǒng)管理員,統(tǒng)計(jì)各類IO是一項(xiàng)必不可少的工作。其統(tǒng)計(jì)工具中iostat顯然又是最重要的一個(gè)統(tǒng)計(jì)手段。但是這里iostat不是本文的重點(diǎn),因?yàn)檫@個(gè)工具的使用在網(wǎng)絡(luò)上已經(jīng)有大量的教程,可以供大家參考。這里主要是想介紹一些其他統(tǒng)計(jì)工具以來滿足不同的需求。
iostat
iostat的功能異常強(qiáng)大,輸出項(xiàng)也特別多,比如下面這個(gè)例子:
- Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
- 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
其各項(xiàng)的含義分別是:
- rrqm/s: 每秒進(jìn)行 merge 的讀操作數(shù)目.即 delta(rmerge)/s
- wrqm/s: 每秒進(jìn)行 merge 的寫操作數(shù)目.即 delta(wmerge)/s
- r/s: 每秒完成的讀 I/O 設(shè)備次數(shù).即 delta(rio)/s
- w/s: 每秒完成的寫 I/O 設(shè)備次數(shù).即 delta(wio)/s
- rsec/s: 每秒讀扇區(qū)數(shù).即 delta(rsect)/s
- wsec/s: 每秒寫扇區(qū)數(shù).即 delta(wsect)/s
- rkB/s: 每秒讀K字節(jié)數(shù).是 rsect/s 的一半,因?yàn)槊可葏^(qū)大小為512字節(jié).(需要計(jì)算)
- wkB/s: 每秒寫K字節(jié)數(shù).是 wsect/s 的一半.(需要計(jì)算)
- avgrq-sz: 平均每次設(shè)備I/O操作的數(shù)據(jù)大小 (扇區(qū)).delta(rsect+wsect)/delta(rio+wio)
- avgqu-sz: 平均I/O隊(duì)列長度.即 delta(aveq)/s/1000 (因?yàn)閍veq的單位為毫秒).
- await: 平均每次設(shè)備I/O操作的等待時(shí)間 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
- svctm: 平均每次設(shè)備I/O操作的服務(wù)時(shí)間 (毫秒).即 delta(use)/delta(rio+wio)
- %util: 一秒中有百分之多少的時(shí)間用于 I/O 操作,或者說一秒中有多少時(shí)間 I/O 隊(duì)列是非空的.即 delta(use)/s/1000 (因?yàn)閡se的單位為毫秒)
如果 %util 接近 100%,說明產(chǎn)生的I/O請求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷,該磁盤可能存在瓶頸.
idle小于70% IO壓力就較大了,一般讀取速度有較多的wait.
同時(shí)可以結(jié)合vmstat查看查看b參數(shù)(等待資源的進(jìn)程數(shù))和wa參數(shù)(IO等待所占用的CPU時(shí)間的百分比,高過30%時(shí)IO壓力高)
另外 await 的參數(shù)也要多和 svctm 來參考。差的過高就一定有 IO 的問題.
avgqu-sz 也是個(gè)做 IO 調(diào)優(yōu)時(shí)需要注意的地方,這個(gè)就是直接每次操作的數(shù)據(jù)的大小,如果次數(shù)多,但數(shù)據(jù)拿的小的話,其實(shí) IO 也會很小.如果數(shù)據(jù)拿的大,才IO 的數(shù)據(jù)會高.也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是講,讀定速度是這個(gè)來決定的.
svctm 一般要小于 await (因?yàn)橥瑫r(shí)等待的請求的等待時(shí)間被重復(fù)計(jì)算了),svctm 的大小一般和磁盤性能有關(guān),CPU/內(nèi)存的負(fù)荷也會對其有影響,請求過多也會間接導(dǎo)致 svctm 的增加.await 的大小一般取決于服務(wù)時(shí)間(svctm) 以及 I/O 隊(duì)列的長度和 I/O 請求的發(fā)出模式.如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時(shí)間;如果 await 遠(yuǎn)大于 svctm,說明 I/O 隊(duì)列太長,應(yīng)用得到的響應(yīng)時(shí)間變慢,如果響應(yīng)時(shí)間超過了用戶可以容許的范圍,這時(shí)可以考慮更換更快的磁盤,調(diào)整內(nèi)核 elevator 算法,優(yōu)化應(yīng)用,或者升級 CPU.
隊(duì)列長度(avgqu-sz)也可作為衡量系統(tǒng) I/O 負(fù)荷的指標(biāo),但由于 avgqu-sz 是按照單位時(shí)間的平均值,所以不能反映瞬間的 I/O 洪水.
有時(shí)間的話,我會單獨(dú)寫幾個(gè)帖子來說說iostat。#p#
iodump
iodump 是一個(gè)統(tǒng)計(jì)每一個(gè)進(jìn)程(線程)所消耗的磁盤I/O工具。這個(gè)一個(gè)perl腳本,其原理時(shí)打開有關(guān)I/O的內(nèi)核記錄消息開關(guān),而后讀取消息然后分析輸出。簡單使用步驟如下:
首先下載這個(gè)工具:
wget http://aspersa.googlecode.com/svn/trunk/iodump
然后打開有關(guān)I/O內(nèi)核消息的開關(guān):
echo 1 >/proc/sys/vm/block_dump
上述開關(guān)打開后,內(nèi)核會記錄下每一個(gè)I/O操作的消息。我們只需要定時(shí)獲取并分析就好了,比如下面這樣:
while true; do sleep 1; dmesg -c ; done |perl iodump
等待一段時(shí)間,然后通過ctrl+c來結(jié)束上述腳本,你將獲得下面類似的信息:
- TASK PID TOTAL READ WRITE DIRTY DEVICES
- postgres 5799 1919 1919 0 0 sda7
- jbd2/sda7-8 1572 35 0 35 0 sda7
- jbd2/sda2-8 250 32 0 32 0 sda2
- flush-8:0 2229 31 0 31 0 sda2, sda7
- postgres 4308 2 0 2 0 sda7
- bash 5804 1 0 1 0 sda2
上述輸出的單位為塊(block),每塊的大小取決于創(chuàng)建文件系統(tǒng)時(shí)指定的塊大小。比如我這個(gè)里的sda7的block大小是1KB。#p#
iotop
iotop是一個(gè)Python編寫的工具,有類似top工具的UI,包括一些參數(shù)也和top類似。不過它對系統(tǒng)有一些要求,分別是:
- Python ≥ 2.5 or Python ≥ 2.4 with the ctypes module
- Kernel ≥ 2.6.20
- Kernel uses options:
- TASK_DELAY_ACCT
- CONFIG_TASKSTATS
- TASK_IO_ACCOUNTING
- CONFIG_VM_EVENT_COUNTERS
如果是基于RPM包的系統(tǒng),可以直接下載編譯好的二進(jìn)制包(here)或者二進(jìn)制源代碼包(here)
如果是Debian/Ubuntu系統(tǒng),直接使用
sudo apt-get install iotop
即可(不得不說,Debian系統(tǒng)提供的軟件真的是相當(dāng)豐富呀),其他系統(tǒng)則可以通過下面的指令下載源代碼,然后編譯
git clone git://repo.or.cz/iotop.git
具體的使用方法可以參考iotop(8)手冊,下面是在我機(jī)器上的一個(gè)顯示:
- iotop -o -u wgzhao
- Total DISK READ: 2.15 M/s | Total DISK WRITE: 1601.15 K/s
- TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
- 5984 be/4 wgzhao 2.15 M/s 70.55 K/s 0.00 % 83.67 % postgres: wgzhao pgbench [local] UPDATE
- 4305 be/4 wgzhao 0.00 B/s 227.34 K/s 0.00 % 0.00 % postgres: writer process
- 4308 be/4 wgzhao 0.00 B/s 90.15 K/s 0.00 % 0.00 % postgres: stats collector process
#p#
iopp
iopp是另外一個(gè)統(tǒng)計(jì)每一個(gè)進(jìn)程I/O的工具,使用C語言編寫,理論上應(yīng)該比上述兩個(gè)重狙效率都要高。
安裝方法很簡單,首先通過下面的指令下載源代碼:
git://github.com/markwkm/iopp.git
然后分別通過下面的指令編譯安裝
- cmake CMakeLists.txt
- make
- make install DESTDIR=/usr
下面是一個(gè)使用例子
- iopp -i -c 2
- pid rchar wchar syscr syscw rbytes wbytes cwbytes command
- 2144 0 296 40 8 0 0 0 /usr/sbin/LCDd
- 2284 0 0 2 0 0 0 0 ha_logd: read process
- 2299 0 0 2 0 0 0 0 ha_logd: write process
- 2520 3 3 3 3 0 0 0 /usr/lib/virtualbox/vboxwebsrv
- 2599 2 2 2 2 0 0 0 /usr/lib/virtualbox/VBoxSVC
- 2675 0 0 1 0 0 0 0 runsvdir
- 3177 16 16 4 2 0 0 0 /usr/bin/gnome-shell
- 3192 16 16 4 2 0 0 0 nautilus
- 3305 180 340 100 60 0 0 0 /usr/lib/icedove/icedove-bin
- 3623 1393 1440 1 1 0 0 0 sshd: wgzhao@pts/0
- 4305 0 4603904 0 562 0 4603904 0 postgres: writer process
- 6257 2064384 1892352 252 215 3719168 139264 0 postgres: wgzhao pgbench [local] UPDATE
上述輸出的各項(xiàng)含義是:
- pid 進(jìn)程ID
- rchar 將要從磁盤讀取的字節(jié)數(shù)
- wchar 已經(jīng)寫入或應(yīng)該要寫入磁盤的字節(jié)數(shù)
- syscr 讀I/O數(shù)
- syscw 寫I/O數(shù)
- rbytes 真正從磁盤讀取的字節(jié)數(shù)
- wbytes 真正寫入到磁盤的字節(jié)數(shù)
- cwbytes 因?yàn)榍蹇枕撁婢彺娑鴮?dǎo)致沒有發(fā)生操作的字節(jié)數(shù)
- command 執(zhí)行的命令
其中rbytes,wbytes,cwbytes會因給出-k或者-m參數(shù),而顯示為rkb,wkb,cwkb或rmb,wmb,cwmb。command一列如果給出-c的參數(shù)則顯示完整的命令名而不僅僅只是命令本身。
這些參數(shù)的使用和top類似。
更具體的可以參考iopp(8)手冊。#p#
dstat
dstat 號稱各種資源統(tǒng)計(jì)工具,其目的是想替代vmstat,iostat,netstat,ifstat等各種單一統(tǒng)計(jì)工具,從而做到All in one。 dstat用Python語言編寫。
dstat能夠清晰顯示每列的信息,特別是單位及大小很明確,不會在單位換算上犯迷糊和失誤。最重要的是,因?yàn)樗腔谀K化設(shè)計(jì),因此我們可以很容易的寫一個(gè)插件來收集我們需要的統(tǒng)計(jì)信息。
另外,dstat的輸出還可以導(dǎo)出為CSV格式文件,從而可以在電子表格工具里分方便的生成統(tǒng)計(jì)圖形。
目前dstat的插件已經(jīng)相當(dāng)多了,這是我機(jī)器上目前的輸出:
- $ dstat --list
- internal:
- aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net,
- page, page24, proc, raw, socket, swap, swapold, sys, tcp, time, udp, unix, vm
- /usr/share/dstat:
- battery, battery-remain, cpufreq, dbus, disk-tps, disk-util, dstat, dstat-cpu, dstat-ctxt,
- dstat-mem, fan, freespace, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre,
- memcache-hits, mysql-io, mysql-keys, mysql5-cmds, mysql5-io, mysql5-keys, net-packets, nfs3,
- nfs3-ops, nfsd3, nfsd3-ops, ntp, postfix, power, proc-count, qmail, rpc, rpcd, sendmail, snooze,
- squid, test, thermal, top-bio, top-bio-adv, top-childwait, top-cpu, top-cpu-adv, top-cputime,
- top-cputime-avg, top-int, top-io, top-io-adv, top-latency, top-latency-avg, top-mem, top-oom, utmp,
- vm-memctl, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi
下面給出幾個(gè)使用的列子(實(shí)際輸出是帶彩色的,很容易識別)
dstat的缺省輸出
- wgzhao-nb:~# dstat
- You did not select any stats, using -cdngy by default.
- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
- usr sys idl wai hiq siq| read writ| recv send| in out | int csw
- 2 1 87 10 0 0| 816k 385k| 0 0 | 0 0 |2279 7048
- 5 1 78 16 0 0|2600k 0 | 140B 940B| 0 0 |5952 13k
- 5 3 80 12 0 0|2896k 182k| 70B 358B| 0 0 |6074 14k
- 4 2 78 16 0 0|2724k 0 | 70B 374B| 0 0 |5703 15k
- 4 2 81 14 0 0|3008k 0 | 70B 358B| 0 0 |5924 13k
- 5 1 80 14 0 0|1976k 17k| 70B 358B| 0 0 |5819 13k
- 5 2 79 14 0 0|2056k 0 | 198B 374B| 0 0 |5618 13k
- 4 2 79 15 0 0|2416k 0 | 70B 358B| 0 0 |5866 15k
- 5 2 78 15 0 0|2528k 0 | 70B 358B| 0 0 |6356 14k
- 5 2 78 16 0 0|2288k 0 | 70B 358B| 0 0 |6515 15k
- 5 2 79 14 0 0|2656k 8192B| 70B 358B| 0 0 |6490 15k
- 3 2 81 13 0 0|2296k 0 | 70B 374B| 0 0 |5573 15k
- 4 3 76 17 0 1|2224k 0 | 70B 358B| 0 0 |5366 12k
- 5 1 81 13 0 0|2208k 0 | 508B 358B| 0 0 |5403 13k
- 4 2 79 15 0 0|2024k 182k| 70B 358B| 0 0 |5583 13k
- 5 2 79 15 0 0|2148k 17k| 186B 490B| 0 0 |5400 12k
指定需要顯示的列
- wgzhao-nb:~# dstat -c --top-cpu -d --top-bio --top-latency
- Module dstat_top_latency failed to load. (Kernel has no scheduler statistics, use at least 2.6.12)
- ----total-cpu-usage---- -most-expensive- -dsk/total- ----most-expensive----
- usr sys idl wai hiq siq| cpu process | read writ| block i/o process
- 2 1 87 10 0 0|gnome-shell 0.7| 826k 384k|postgres 692k 52k
- 4 2 79 16 0 0|postgres: wgz3.0|1744k 776k|postgres: w1744k 72k
- 5 3 78 15 0 0|postgres: wgz5.0|3120k 0 |postgres: w3064k 136k
- 6 2 73 19 0 0|postgres: wgz4.2|2608k 285k|postgres: w2608k 136k
- 4 2 77 17 0 0|postgres: wgz3.5|2112k 848k|postgres: w2112k 88k
- 3 2 71 25 0 0|postgres: wgz2.0| 944k 1049k|postgres: w 936k 48k
- 3 2 58 37 0 0|postgres: wgz2.0| 920k 2070k|postgres: w 928k 64k
- 3 2 62 34 0 0|postgres: wgz2.2|1496k 992k|postgres: w1608k 72k
- 3 2 56 38 0 0|postgres: wgz3.0|1840k 645k|postgres: w1856k 88k
- 3 2 78 17 0 0|postgres: wgz3.0|1420k 1200k|postgres: w1292k 80k
- 5 2 80 12 0 1|postgres: wgz4.2|2628k 0 |postgres: w2636k 112k
- 4 3 69 25 0 0|postgres: wgz3.8|2168k 576k|postgres: w2224k 104k
指定需要顯示的列,并同時(shí)將結(jié)果導(dǎo)出到文件
- wgzhao-nb:~# dstat --disk --mem --proc --io --sys --filesystem --tcp --vm --output dstat.csv
- -dsk/total- ------memory-usage----- ---procs--- --io/total- ---system-- --filesystem- ----tcp-sockets---- -----virtual-memory----
- read writ| used buff cach free|run blk new| read writ| int csw |files inodes|lis act syn tim clo|majpf minpf alloc free
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
更詳細(xì)的用法,可以參考dstat(1)手冊。
原文鏈接:http://blog.wgzhao.com/2012/08/22/some-way-to-io-statistics-on-linux/