1. 程式人生 > 實用技巧 >25-基礎篇:Linux磁碟IO是怎麼工作的(下)

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

上一節我們學習了 Linux 磁碟 I/O 的工作原理,並瞭解了由檔案系統層、通用塊層和裝置層構成的 Linux 儲存系統 I/O 棧。

其中,通用塊層是 Linux 磁碟 I/O 的核心。向上,它為檔案系統和應用程式,提供訪問了塊裝置的標準介面;向下,把各種異構的磁碟裝置,抽象為統一的塊裝置,並會對檔案系統和應用程式發來的 I/O 請求,進行重新排序、請求合併等,提高了磁碟訪問的效率。

掌握了磁碟 I/O 的工作原理,你估計迫不及待想知道,怎麼才能衡量磁碟的 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效能測試的第一步。接下來,又該用什麼方法來觀測它們呢?這裡,我給你介紹幾個常用的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 大小等,進行綜合分析。