Linux下的一些I/O統計工具
From: http://wgzhao.com/2012/08/22/some-way-to-io-statistics-on-linux/
Linux 系統管理員,統計各類 IO 是一項必不可少的工作。其統計工具中 iostat 顯然又是最重要的一個統計手段。但是這裡 iostat 不是本文的重點,因為這個工具的使用在網路上已經有大量的教程,可以供大家參考。這裡主要是想介紹一些其他統計工具以來滿足不同的需求。
iostat
iostat 的功能異常強大,輸出項也特別多,比如下面這個例子:
1 2 3 |
|
其各項的含義分別是:
- 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 的核心記錄訊息開關,而後讀取訊息然後分析輸出。簡單使用步驟如下:
首先下載這個工具
wget
http://aspersa.googlecode.com/svn/trunk/iodump
然後開啟有關 I/O 核心訊息的開關
echo
1 >/proc/sys/vm/block_dump
上述開關開啟後,核心會記錄下每一個 I/O 操作的訊息。我們只需要定時獲取並分析就好了,比如下面這樣
while
true; do sleep 1; dmesg -c ; done |perl iodump
等待一段時間,然後通過ctrl+c
來結束上述指令碼,你將獲得下面類似的資訊:
1 2 3 4 5 6 7 |
|
上述輸出的單位為塊(block),每塊的大小取決於建立檔案系統時指定的塊大小。比如我這個裡的 sda7 的 block 大小是 1KB。
iotop
iotop 是一個 Python 編寫的工具,有類似top
工具的
UI,包括一些引數也和top
類似。不過它對系統有一些要求,分別是:
- 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 包的系統,可以直接下載編譯好的二進位制包(here)或者二進位制原始碼包(here)
如果是 Debian/Ubuntu 系統,直接使用
sudo
apt-get install iotop
即可(不得不說,Debian 系統提供的軟體真的是相當豐富呀),其他系統則可以通過下面的指令下載原始碼,然後編譯
git
clone git://repo.or.cz/iotop.git
具體的使用方法可以參考 iotop(8)手冊,下面是在我機器上的一個顯示:
1 2 3 4 5 6 |
|
iopp
iopp 是另外一個統計每一個程序 I/O 的工具,使用 C 語言編寫,理論上應該比上述兩個重狙效率都要高。安裝方法很簡單,首先通過下面的指令下載原始碼:
git://github.com/markwkm/iopp.git
然後分別通過下面的指令編譯安裝
1 2 3 |
|
下面是一個使用例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
上述輸出的各項含義是:
- 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 2 3 4 5 6 7 8 9 10 11 12 |
|
下面給出幾個使用的列子