25-基礎篇:Linux磁碟I/O是怎麼工作的(下)
磁碟效能指標
磁碟效能的衡量標準,有五個:使用率、飽和度、IOPS、吞吐量、響應時間
- 使用率是指磁碟處理I/O的時間百分比
過高的使用率(比如超過 80%),通常意味著磁碟I/O存在效能瓶頸 - 飽和度,是指磁碟處理I/O的繁忙程度
過高的飽和度,意味著磁碟存在嚴重的效能瓶頸
當飽和度為100% 時,磁碟無法接受新的I/O請求 - IOPS(Input/Output Per Second)是指每秒的I/O請求數
- 吞吐量是指每秒的I/O請求大小
- 響應時間是指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