性能評估-disk IO


一、磁盤原理

設備又名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/s

real    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/s real 0m36.331s user 0m0.018s sys 0m2.823s
通過以上方法就可以大致知道,磁盤的性能了。

二、磁盤性能監控

2.1 linux系統監控

2.1.1獲取IOPS

[root@localhost ~]# iostat -m 3
Linux 2.6.18-238.el5 (localhost.localdomain)     08/03/2017

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.09    0.87    0.87    0.00   98.16

Device:            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。

從這條命令中:我們知道:IOPS(每秒io請求數)是:6.91。當前讀速率是:0.44MB/s .寫速率是:0.36MB/s

2.1.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   %idle
           0.00    0.00    3.67   23.14    0.00   73.19

Device:         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.00

  • rrqm/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隊列非空的時間比率

得出結論有:   

每秒共有80個IO請求(IOPS=r/s+w/s),以寫為主

io服務時間為1.56毫秒,平均等待服務時間為3.53毫秒

io隊列深度為:2.4個

2.1.3 IO評估指標

1、vmstat Block in /out
bi+bo過大,而且vmstat cpu wa值較大應該考慮均衡磁盤負載,可以結合iostat輸出來分析。

2、IOwait time
iostat iowait% 小於25%,說明IO性能處於良好的狀態;

3、util 磁盤使用率
 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的即 delta(use)/s/1000 (因為use的單位為毫秒)
(1)如果 %util 接近 100%說明產生的I/O請求太多I/O系統已經滿負荷該磁盤可能存在瓶頸
(2)idle小於70% IO壓力就較大了一般讀取速度有較多的wait
(3)同時可以結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所占用的CPU時間的百分比高過30%時IO壓力高)
4、await 平均等待時間
平均每次設備I/O操作的等待時間 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
await 的大小一般取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式
(1)await 的參數要多和 svctm 來參考差的過高就一定有 IO 的問題
(2)如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;
(3)如果 await 遠大於 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。如果響應時間超過了用戶可以容許的范圍這時可以考慮更換更快的磁盤調整內核 elevator 算法優化應用
5、avgqu-sz 平均I/O隊列長度
(1)如果avgqu-sz比較大,也表示有大量io在等待。
avgqu-sz 也是個做 IO 調優時需要注意的地方這個就是直接每次操作的數據的大小如果次數多但數據拿的小的話其實 IO 也會很小如果數據拿的大IO 的數據會高也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s也就是講讀寫速度是這個來決定的
由於 avgqu-sz 是按照單位時間的平均值所以不能反映瞬間的 I/O 洪水

 

2.2 iotop監控io繁忙的進程

里面最重要的參數,actual disk read 和actual disk write  分別代表實際磁盤讀寫速度

然后下面,我們可以根據每一列進行io排序,就能知道io具體消耗是哪個進程導致的。

注意:TID代表的是線程號,如果是多線程的話,可以借助command 判斷是哪個進程,也可以根據ps -eLf | grep TID 來獲取到他的父進程號。

 

2.2 aix/unix 系統監控

2.2.1 topas  獲取是否存在io等待

仔細觀察 “Wait”(在 CPU 部分的上部),如果改值較大則表示io可能存在瓶頸

2.2.2 獲取io隊列、IOPS、響應時間等

登錄 AIX 操作系統,輸入 topas,然后按 D,會出現如下界面:

Figure xxx. Requires a heading

在上圖中,hdisk2 的TPS 即為磁盤的 IOPS(每秒發出的io請求數),為 655;KBPS 即為磁盤每秒的吞吐量,為 163.9M;尤其是應該檢查 ART/AWT 和 MRT/MWT,它們表示磁盤讀寫操作的平均和最大等待時間。比較高的值表明磁盤非常忙。AQW 表示對 I/O 設備的每個請求的平均等待隊列數量。同樣,比較高的值表明磁盤的速度無法跟上請求的速度。

 2.2.3 查看產生瓶頸的原因
  1.可以使用其他工具(如 filemon、fileplace、lsof 或 lslv)幫助確定究竟是哪個進程、適配器或者文件系統導致了瓶頸。
  2.可以使用ps -ef | grep "pid" 來查看當前進程所在執行的任務

2.3 查找前10個大文件

find . -type f -size +100M -print0 | xargs -0 du -h | sort -nr

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM