一文講解系統(tǒng)性能分析之|iowait是什么?
我們對系統(tǒng)性能進行優(yōu)化時,一般會使用?top
?命令來查看系統(tǒng)負載和系統(tǒng)中各個進程的運行情況,從而找出影響系統(tǒng)性能的因素。如下圖所示:

top
?命令會輸出很多系統(tǒng)相關的信息,如:系統(tǒng)負載、系統(tǒng)中的進程數(shù)、CPU使用率和內存使用率等,這些信息對排查系統(tǒng)性能問題起著至關重要的作用。
本文主要介紹?top
?命令中的?iowait
?指標(如上圖中紅色方框所示)的含義和作用。
什么是iowait
什么是?iowait
?我們來看看 Linux 的解釋:
Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
中文翻譯的意思就是:CPU 在等待磁盤 I/O 請求完成時,處于空閑狀態(tài)的時間百分比(此時正在運行著?idle
?進程)。
可以看出,如果系統(tǒng)處于?iowait
?狀態(tài),那么必須滿足以下兩個條件:
系統(tǒng)中存在等待 I/O 請求完成的進程。
系統(tǒng)當前正處于空閑狀態(tài),也就是說沒有可運行的進程。
iowait統(tǒng)計原理
既然我們知道了?iowait
?的含義,那么接下來看看 Linux 是怎么統(tǒng)計?iowait
?的比率的。
Linux 會把?iowait
?占用的時間輸出到?/proc/stat
?文件中,我們可以通過一下命令來獲取到?iowait
?占用的時間:
命令輸出如下圖所示:

紅色方框中的數(shù)據(jù)就是?iowait
?占用的時間。
我們可以每隔一段時間讀取一次?/proc/stat
?文件,然后把兩次獲取到的?iowait
?時間進行相減,得到的結果是這段時間內,CPU處于?iowait
?狀態(tài)的時間。接著再將其除以總時間,得到?iowait
?占用總時間的比率。
現(xiàn)在我們來看看?/proc/stat
?文件是怎樣獲取?iowait
?的時間的。
在內核中,每個 CPU 都有一個?cpu_usage_stat
?結構,主要用于統(tǒng)計 CPU 一些信息,其定義如下:
cpu_usage_stat
?結構的?iowait
?字段記錄了 CPU 處于?iowait
?狀態(tài)的時間。
所以要獲取系統(tǒng)處于?iowait
?狀態(tài)的總時間,只需要將所有 CPU 的?iowait
?時間相加即可,代碼如下(位于源文件?fs/proc/stat.c
):
show_stat()
?函數(shù)首先會遍歷所有 CPU,然后讀取其?iowait
?時間,并且將它們相加。


增加iowait時間
從上面的分析可知,每個 CPU 都有一個用于統(tǒng)計?iowait
?時間的計數(shù)器,那么什么時候會增加這個計數(shù)器呢?
答案是:系統(tǒng)時鐘中斷
。
在?系統(tǒng)時鐘中斷
?中,會調用?account_process_tick()
?函數(shù)來更新 CPU 的時間,代碼如下:
我們主要關注當前進程是?idle
?進程的情況,這是內核會調用?account_idle_time()
?函數(shù)進行處理,其代碼如下:
account_idle_time()
?函數(shù)的邏輯比較簡單,主要分以下兩種情況進行處理:
如果當前有進程在等待 I/O 請求的話,那么增加?
iowait
?的時間。如果當前沒有進程在等待 I/O 請求的話,那么增加?
idle
?的時間。
所以,從上面的分析可知,要增加?iowait
?的時間需要滿足以下兩個條件:
當前進程是?
idle
?進程,也就是說 CPU 處于空閑狀態(tài)。有進程在等待 I/O 請求完成。
進一步說,當 CPU 處于?iowait
?狀態(tài)時,說明 CPU 處于空閑狀態(tài),并且系統(tǒng)中有進程因為等待 I/O 請求而阻塞,也說明了 CPU 的利用率不夠充分。
這時,我們可以使用異步 I/O(如?iouring
)來優(yōu)化程序,使得進程不會被 I/O 請求阻塞。
原文作者:Linux內核那些事
