如何監測 Linux 的磁盤 I/O 性能
在我之前的文章:《探討 Linux 的磁盤 I/O》中,我談到了 Linux 磁盤 I/O 的工作原理,我們了解到 Linux 存儲系統 I/O 棧由文件系統層(file system layer)、通用塊層( general block layer)和設備層(device layer)構成。
其中,通用塊層是 Linux 磁盤 I/O 的核心。向上,它為訪問文件系統和應用程序的塊設備提供了標準接口;向下,它將各種異構磁盤設備抽象為一個統一的塊設備,并響應文件系統和應用程序發送的 I/O。
在本文中,我們來看看磁盤的性能指標以及如何查看這些指標。
Linux 磁盤性能指標
在衡量磁盤性能時,我們經常提到五個常見指標:利用率、飽和度、IOPS、吞吐量和響應時間。這五個指標是衡量磁盤性能的基本指標。
-
利用率(Utilization):磁盤處理 I/O 的時間百分比。過度使用(如超過 80%)通常意味著磁盤 I/O 存在性能瓶頸。 -
飽和度(Saturation):指磁盤處理 I/O 的繁忙程度。過度飽和意味著磁盤存在嚴重的性能瓶頸。當飽和度為 100% 時,磁盤無法接受新的 I/O 請求。 -
IOPS(Input/Output Per Second):指每秒 I/O 請求的數量。 -
吞吐量(Throughput):每秒 I/O 請求的大小。 -
響應時間(Response time):指發送 I/O 請求和接收響應之間的間隔時間。
這里需要注意的是,關于利用率,我們只考慮有無 I/O,而不考慮 I/O 的大小。也就是說,當利用率為 100% 時,磁盤仍有可能接受新的 I/O 請求。
一般來說,在為應用選擇服務器時,首先要對磁盤的 I/O 性能進行基準測試,這樣才能準確評估磁盤性能,以判斷是否能夠滿足應用的需求。
當然,這需要你在隨機讀、順序讀、隨機寫、順序寫等各種應用場景下測試不同 I/O 大小(通常是 512B ~ 1MB 之間)的性能。
磁盤 I/O 觀察
首先要觀察的是每個磁盤的使用情況。iostat 是最常用的磁盤 I/O 性能觀察工具。它提供了各種常用性能指標,例如每個磁盤的利用率、IOPS?和吞吐量。當然,這些指標實際上來自?/proc/diskstats
。
以下是?iostat
?的輸出示例:
在上述指標中,您需要注意的是:
-
%util
?是我們前面提到的磁盤 I/O 使用情況 -
r/s
?和?w/s
?是 IOPS -
rkB/s
?和?wkB/s
?是吞吐量 -
r_await
?和?w_await
?是響應時間
您可能已經注意到?iostat
?不能直接獲取磁盤的飽和度。事實上,通常沒有什么簡單的方法可以測量飽和度。但是,您可以將觀察到的平均請求隊列長度或完成讀寫請求的等待時間與基準測試(例如通過 fio)的結果進行比較,以綜合評估磁盤飽和度。
進程 I/O 觀察
除了每個磁盤的 I/O 情況,每個進程的 I/O 情況也是大家關注的重點。
上面提到的?iostat
?只提供了觀察磁盤的整體 I/O 性能數據。缺點是無法知道哪些進程正在讀寫磁盤。要觀察進程的 I/O,還可以使用?pidstat
?和?iotop
?工具。
例如,要使用?pidstat
從?pidstat
?的輸出可以看出,它可以實時查看每個進程的 I/O 情況,這包括以下內容:
-
用戶 ID ( UID
) 和進程 ID (PID
)。 -
每秒讀取的數據大小 ( kB_rd/s
),以 KB 為單位。 -
每秒發出的寫請求數據的大小( kB_wr/s
),單位為KB。 -
每秒取消寫入請求的數據大小 ( kB_ccwr/s
),以 KB 為單位。 -
塊 I/O 延遲 ( iodelay
),包括等待同步塊(synchronized block)I/O 和換入塊(swap-in block)I/O 完成的時間,以時鐘周期為單位。
除了使用?pidstat
?實時查看進程磁盤 I/O 外,還有一個磁盤性能分析的常用方法是根據 I/O 大小對進程進行排序。為此,我推薦?iotop
?工具。它是一個類似于?top
?的工具,您可以按 I/O 大小對進程進行排序,并找到具有更大 I/O 的進程。
從該輸出可以看到,前兩行分別代表進程的磁盤讀寫總大小和磁盤的實際讀寫總大小。由于緩存、緩沖區、I/O 合并等因素,它們可能不相等。
剩下的部分從各個角度代表了進程的 I/O 情況,包括?線程 ID、I/O 優先級、每秒磁盤讀取大小、每秒磁盤寫入大小、換入百分比和等待 I/O 時鐘百分比。
結論
在本文中,我介紹了 Linux 磁盤 I/O 的性能指標和查看性能工具。我們通常使用?IOPS、吞吐量、利用率、飽和度和響應時間等幾個指標來評估磁盤的 I/O 性能。
可以使用?iostat
?獲取磁盤的 I/O 情況,也可以使用?pidstat
、iotop
?等觀察進程的 I/O 情況。但在分析這些性能指標時,要注意結合讀寫比率、I/O 類型、I/O 大小等綜合分析。
鏈接:https://blog.devgenius.io/linux-disk-i-o-performance-1e920faba23
(版權歸原作者所有,侵刪)