Linux磁盤IO那些事

磁盤性能指標

說到磁盤性能的衡量標準,必須要提到五個常見指標,也就是我們經常用到的,使用率、飽和度、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 性能測試的第一步。接下來,又該用什麼方法來觀測它們呢?這裏,我給你介紹幾個常用的 I/O 性能觀測方法。

磁盤 I/O 觀測

第一個要觀測的,是每塊磁盤的使用情況。

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

iostat 的輸出界面如下。

# -d -x 表示顯示所有磁盤 I/O 的指標
$ iostat -d -x 1 
Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util 
loop0            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 
loop1            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 
sda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 
sdb              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 

從這裏你可以看到,iostat 提供了非常豐富的性能指標。第一列的 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 是我們的老朋友了,這裏我就不再囉嗦它的功能了。給它加上 -d 參數,你就可以看到進程的 I/O 情況,如下所示:

$ pidstat -d 1 
13:39:51      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command 
13:39:52      102       916      0.00      4.00      0.00       0  rsyslogd

從 pidstat 的輸出你能看到,它可以實時查看每個進程的 I/O 情況,包括下面這些內容。

  • 用戶 ID(UID)和進程 ID(PID) 。

  • 每秒讀取的數據大小(kB_rd/s) ,單位是 KB。

  • 每秒發出的寫請求數據大小(kB_wr/s) ,單位是 KB。

  • 每秒取消的寫請求數據大小(kB_ccwr/s) ,單位是 KB。

  • 塊 I/O 延遲(iodelay),包括等待同步塊 I/O 和換入塊 I/O 結束的時間,單位是時鐘週期。

除了可以用 pidstat 實時查看,根據 I/O 大小對進程排序,也是性能分析中一個常用的方法。這一點,我推薦另一個工具, iotop。它是一個類似於 top 的工具,你可以按照 I/O 大小對進程排序,然後找到 I/O 較大的那些進程。

iotop 的輸出如下所示:

$ iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :       7.85 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 
15055 be/3 root        0.00 B/s    7.85 K/s  0.00 %  0.00 % systemd-journald 

從這個輸出,你可以看到,前兩行分別表示,進程的磁盤讀寫大小總數和磁盤真實的讀寫大小總數。因爲緩存、緩衝區、I/O 合併等因素的影響,它們可能並不相等。

剩下的部分,則是從各個角度來分別表示進程的 I/O 情況,包括線程 ID、I/O 優先級、每秒讀磁盤的大小、每秒寫磁盤的大小、換入和等待 I/O 的時鐘百分比等。

這兩個工具,是我們分析磁盤 I/O 性能時最常用到的。你先了解它們的功能和指標含義,具體的使用方法,接下來的案例實戰中我們一起學習。

小結

今天,我們梳理了 Linux 磁盤 I/O 的性能指標和性能工具。我們通常用 IOPS、吞吐量、使用率、飽和度以及響應時間等幾個指標,來評估磁盤的 I/O 性能。

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

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章