磁盤監控原理
設備又名I/O設備,泛指計算機系統中除主機以外的所有外部設備。
1.1 計算機分類
1.1.1 按照信息傳輸速度分:
1.低速設備:每秒傳輸信息僅幾個字節或者百個字節,如:鍵盤、鼠標等
2.中速設備:每秒傳輸信息數千個字節或者數萬個字節,如:打印機
3.高速設備:每秒傳輸信息數數10萬個字節,如:磁盤
1.1.2 按照信息交換單位分
1.字符設備:以字符為輸入/輸出信息的單位,如:鍵盤,顯示終端
2.塊設備:以數據塊為單位輸入/輸出信息,如:磁盤
注:何為數據塊:磁盤中常以一個扇區作為一個數據塊,一個扇區就是一個讀寫單位
一、磁盤性能指標
1、測試磁盤性能,使用命令:dd
因數據寫入磁盤,可能是緩存寫,直接寫(不經過緩沖區直接寫入磁盤),順序io,隨機io的區別所以,這種dd測試并不是很準確。
這不是一個專業的測試工具,不過如果對于測試結果的要求不是很苛刻的話,平時可以使用來對磁盤的讀寫速度作一個簡單的評估.
在使用前首先了解兩個特殊設備
/dev/null 偽設備,回收站.寫該文件不會產生IO
/dev/zero 偽設備,會產生空字符流,對它不會產生IO
測試磁盤寫速率
[root@localhost ~]# time dd if=/dev/zero of=/test.dbf bs=8k count=300000 #注意:會在根目錄下產生一個test.dbf文件,記得測試完后刪除
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 68.191 seconds, 36.0 MB/s #寫速率36MB/sreal 1m13.960s
user 0m0.077s
sys 0m5.272s測試磁盤讀速率
[root@localhost ~]# time dd if=/test.dbf of=/dev/null bs=8k #讀test.dbf文件
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 36.2647 seconds, 67.8 MB/s #讀速率67.8MB/sreal 0m36.331s
user 0m0.018s
sys 0m2.823s
二、磁盤性能監控
1. 獲取iops
[root@localhost ~]# iostat -m 3
Linux 2.6.18-238.el5 (localhost.localdomain) 08/03/2017avg-cpu: %user %nice %system %iowait %steal %idle0.01 0.09 0.87 0.87 0.00 98.16Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 6.91 0.44 0.36 6162 5009
sda1 0.01 0.00 0.00 1 0
sda2 6.90 0.44 0.36 6161 5009
dm-0 100.40 0.44 0.36 6160 5009
dm-1 0.01 0.00 0.00 0 0
tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。
“一次傳輸"意思是"一次I/O請求”。多個邏輯請求可能會被合并為"一次I/O請求"。"一次傳輸"請求的大小是未知的。
- MB_read/s:每秒從設備(drive expressed)讀取的數據量;
- MB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
- MB_read:讀取的總數據量;
- MB_wrtn:寫入的總數量數據量;這些單位都為Kilobytes。
2. 獲取IOPS、io隊列、io等待、io響應時間等
[root@localhost ~]# iostat -xm 3 #m 代表以MB為單位顯示。
Linux 2.6.18-238.el5 (localhost.localdomain) 08/03/2017avg-cpu: %user %nice %system %iowait %steal %idle0.00 0.00 3.67 23.14 0.00 73.19Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 304.67 0.33 636.00 3.33 76.76 0.01 245.93 2.40 3.53 1.56 99.87
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 304.67 0.33 636.00 3.33 76.76 0.01 245.93 2.40 3.53 1.56 99.87
dm-0 0.00 0.00 941.33 3.67 76.78 0.01 166.43 3.25 3.30 1.06 99.87
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00rrqm/s: 每秒對該設備的讀請求被合并次數,文件系統會對讀取同塊(block)的請求進行合并
wrqm/s: 每秒對該設備的寫請求被合并次數
r/s: 每秒完成的讀請求次數
w/s: 每秒完成的寫請求次數
rkB/s: 每秒讀數據量(kB為單位)
wkB/s: 每秒寫數據量(kB為單位)
avgrq-sz:平均每次IO操作的數據量(扇區數為單位)
avgqu-sz: 平均等待處理的IO請求隊列長度
await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
svctm: 平均每次IO請求的處理時間(毫秒為單位)
%util: 采用周期內用于IO操作的時間比率,即IO隊列非空的時間比率
3. IO評估指標
-
vmstat Block in /out
bi+bo過大,而且vmstat cpu wa值較大應該考慮均衡磁盤負載,可以結合iostat輸出來分析。 -
IOwait time
iostat iowait% 小于25%,說明IO性能處于良好的狀態; -
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 平均等待時間
平均每次設備I/O操作的等待時間 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
await 的大小一般取決于服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。- await 的參數要多和 svctm 來參考。差的過高就一定有 IO 的問題。
- 如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;
- 如果 await 遠大于 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。如果響應時間超過了用戶可以容許的范圍,這時可以考慮更換更快的磁盤,調整內核 elevator 算法,優化應用。
-
avgqu-sz 平均I/O隊列長度
- 如果avgqu-sz比較大,也表示有大量io在等待。
avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的數據的大小,如果次數多,但數據拿的小的話,其實 IO 也會很小。如果數據拿的大,IO 的數據會高。也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是講,讀寫速度是這個來決定的。
由于 avgqu-sz 是按照單位時間的平均值,所以不能反映瞬間的 I/O 洪水。
- 如果avgqu-sz比較大,也表示有大量io在等待。
4. iotop
里面最重要的參數,actual disk read 和actual disk write 分別代表實際磁盤讀寫速度
然后下面,我們可以根據每一列進行io排序,就能知道io具體消耗是哪個進程導致的。
注意:TID代表的是線程號,如果是多線程的話,可以借助command 判斷是哪個進程,也可以根據ps -eLf | grep TID 來獲取到他的父進程號。