1. 程式人生 > 其它 >25-基礎篇:Linux磁碟I/O是怎麼工作的(下)

25-基礎篇:Linux磁碟I/O是怎麼工作的(下)





磁碟效能指標

磁碟效能的衡量標準,有五個:使用率、飽和度、IOPS、吞吐量、響應時間

  1. 使用率是指磁碟處理I/O的時間百分比
    過高的使用率(比如超過 80%),通常意味著磁碟I/O存在效能瓶頸
  2. 飽和度,是指磁碟處理I/O的繁忙程度
    過高的飽和度,意味著磁碟存在嚴重的效能瓶頸
    當飽和度為100% 時,磁碟無法接受新的I/O請求
  3. IOPS(Input/Output Per Second)是指每秒的I/O請求數
  4. 吞吐量是指每秒的I/O請求大小
  5. 響應時間是指I/O請求從發出到收到響應的間隔時間

這裡要注意的是,使用率只考慮有沒有I/O,而不考慮I/O的大小
換句話說,當使用率是100%的時候,磁碟依然有可能接受新的I/O請求

不要孤立地去比較某一指標,而要結合讀寫比例、I/O型別(隨機還是連續) 以及I/O的大小,綜合來分析

舉個例子,
在資料庫、大量小檔案等這類隨機讀寫比較多的場景中,IOPS更能反映系統的整體效能
而在多媒體等順序讀寫較多的場景中,吞吐量才更能反映系統的整體效能

在為應用程式的伺服器選型時,要先對磁碟的I/O效能進行基準測試,以便可以準確評估,磁碟效能是否可以滿足應用程式的需求

fio效能測試工具,用來測試磁碟的IOPS、吞吐量以及響應時間等核心指標
在基準測試時,一定要注意根據應用程式I/O的特點,來具體評估指標

需要測試出,不同I/O大小(一般是512B至1MB中間的若干值)分別在隨機讀、順序讀、隨機寫、順序寫等各種場景下的效能情況

用效能工具得到的這些指標,可以作為後續分析應用程式效能的依據
一旦發生效能問題,就可以把它們作為磁碟效能的極限值,進而評估磁碟I/O的使用情況




磁碟I/O觀測

iostat是最常用的磁碟I/O效能觀測工具,它提供了每個磁碟的使用率、IOPS、吞吐量等各種常見的效能指標
當然,這些指標實際上來自/proc/diskstats

# -d -x 表示顯示所有磁碟 I/O 的指標
[root@local_sa_192-168-1-6 ~]# iostat -d -x 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
vda               0.00     0.06    0.00    0.53     0.03     4.49    17.08     0.00    1.08    3.79    1.07   0.49   0.03
vdb               0.00     0.15    0.00    0.27     0.00     1.71    12.60     0.00    2.78    7.60    2.77   0.60   0.02

##
Device           表示磁碟裝置的名字
%util            就是磁碟I/O使用率
r/s、w/s         就是 IOPS
rkB/s、wkB/s     就是吞吐量
r_await、w_await 就是響應時間

##
在觀測指標時,可以結合請求的大小(rareq-sz和wareq-sz)一起分析

從iostat並不能直接得到磁碟飽和度
事實上,飽和度通常也沒有其他簡單的觀測方法
不過可以把觀測到的,平均請求佇列長度或者讀寫請求完成的等待時間
跟基準測試的結果(比如通過 fio)進行對比,綜合評估磁碟的飽和情況




程序I/O觀測

除了每塊磁碟的I/O情況,每個程序的I/O情況也是需要關注的重點

上面提到的iostat只提供磁碟整體的I/O效能資料
缺點在於,並不能知道具體是哪些程序在進行磁碟讀寫
要觀察程序的I/O情況,可以使用pidstat和iotop這兩個工具


pidstat檢視程序的I/O情況

[root@local_sa_192-168-1-6 ~]# pidstat -d 1
11時20分16秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
11時20分17秒     0      8537      0.00      7.84      0.00  PM2 v4.4.0: God
11時20分17秒     0      9115      0.00      3.92      0.00  node /data/node
11時20分17秒     0     10568      0.00      3.92      0.00  node /data/node
##
時間
使用者ID(UID)
程序ID(PID)
每秒讀取的資料大小(kB_rd/s)單位是KB
每秒發出的寫請求資料大小(kB_wr/s)單位是KB
每秒取消的寫請求資料大小(kB_ccwr/s)單位是KB
##
塊I/O延遲(iodelay),包括等待同步塊I/O和換入塊I/O結束的時間,單位是時鐘週期

iotop根據I/O大小對程序排序

[root@local_sa_192-168-1-6 ~]# iotop
Total DISK READ :	0.00 B/s | Total DISK WRITE :      35.06 K/s
Actual DISK READ:	0.00 B/s | Actual DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
10576 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % node /data/node/mahjong/robot/main.js [node]
 9123 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % node /data/node/mahjong/room/main.js [node]
 5548 be/4 root        0.00 B/s    3.90 K/s  0.00 %  0.00 % mongod -f /data/mongodb/mongod_5000/mongod.yaml [ftdc]
##
前兩行分別表示,程序的磁碟讀寫大小總數和磁碟真實的讀寫大小總數
因為快取、緩衝區、I/O合併等因素的影響,它們可能並不相等
##
剩下的部分,則是從各個角度來分別表示程序的I/O情況,包括執行緒ID、I/O優先順序
每秒讀磁碟的大小、每秒寫磁碟的大小、換入和等待I/O的時鐘百分比等



小結

常用IOPS、吞吐量、 使用率、飽和度以及響應時間等幾個指標,來評估磁碟的I/O效能

可以用iostat獲得磁碟的I/O情況,也可以用pidstat、iotop等觀察程序的I/O情況
不過在分析這些效能指標時,要注意結合讀寫比例、I/O型別以及I/O大小等,進行綜合分析


轉載請註明出處喲~ https://www.cnblogs.com/lichengguo