%IOWAIT深入瞭解

之前一直以爲、top看到%IOWAIT就是有問題,後來跟之前的同事探討的時候,有了一個新的認識。


%iowait 是 “sar -u” 等工具檢查CPU使用率時顯示的一個指標,在Linux上顯示爲 %iowait,在有的Unix版本上顯示爲 %wio,含義都是一樣的。這個指標常常被誤讀,很多人把它當作I/O問題的徵兆,我自己每隔一段時間就會遇到對 %iowait 緊張兮兮的客戶,不得不費盡脣舌反覆解釋。事實上這個指標所含的信息量非常少,不能單獨用來判斷系統有沒有I/O問題。在此我們詳細探討一下它真正的含義,先從man page上的解釋開始:


1

2

3

4

5

6

09:35:06 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

09:35:07 AM     all      0.00      0.00      0.00      0.00      0.00    100.00

09:35:08 AM     all      0.51      0.00      2.53     13.13      0.00     83.84

09:35:09 AM     all      1.54      0.00      7.69     39.49      0.00     51.28

09:35:10 AM     all      2.04      0.00      9.18     39.80      0.00     48.98

09:35:11 AM     all      1.02      0.00      7.65     40.31      0.00     51.02


 Linux:
%iowait
Percentage of time that the CPU or CPUs were idle during
which the system had an outstanding disk I/O request.

HP-UX:
%wio
idle with some process waiting for I/O (only block I/O, raw
I/O, or VM pageins/swapins indicated).

Linux和HP-UX的man page分別從兩個角度描述了這個指標:Linux着眼於I/O,強調的是仍有未完成的I/O請求;而HP-UX着眼於進程,強調的是仍有進程在等待I/O。二者所說的是同一件事的兩個方面,合在一起就完整了,就是:至少有一個I/O請求尚未完成,有進程因爲等待它而休眠。

我們不妨採納Linux的措辭,%iowait 表示在一個採樣週期內有百分之幾的時間屬於以下情況:CPU空閒、並且有仍未完成的I/O請求。

對 %iowait 常見的誤解有兩個:一是誤以爲 %iowait 表示CPU不能工作的時間,二是誤以爲 %iowait 表示I/O有瓶頸。

第一種誤解太低級了,%iowait 的首要條件就是CPU空閒,既然空閒當然就可以接受運行任務,只是因爲沒有可運行的進程,CPU才進入空閒狀態的。那爲什麼沒有可運行的進程呢?因爲進程都處於休眠狀態、在等待某個特定事件:比如等待定時器、或者來自網絡的數據、或者鍵盤輸入、或者等待I/O操作完成,等等。

第二種誤解更常見,爲什麼人們會認爲 %iowait 偏高是有I/O瓶頸的跡象呢?他們的理由是:”%iowait  的第一個條件是CPU空閒,意即所有的進程都在休眠,第二個條件是仍有未完成的I/O請求,意味着進程休眠的原因是等待I/O,而 %iowait 升高則表明因等待I/O而休眠的進程數量更多了、或者進程因等待I/O而休眠的時間更長了。“ 聽上去似乎很有道理,但是不對:

首先 %iowait 升高並不能證明等待I/O的進程數量增多了,也不能證明等待I/O的總時間增加了。爲什麼呢?看看下面兩張圖就明白了。

第一張圖演示的是,在I/O完全一樣的情況下,CPU忙閒狀態的變化就能夠影響 %iowait 的大小。下圖我們看到,在CPU繁忙期間發生的I/O,無論有多少,%iowait 的值都是不受影響的(因爲 %iowait 的第一個前提條件就是CPU必須空閒);當CPU繁忙程度下降時,有一部分I/O落入了CPU空閒的時間段內,這就導致了 %iowait 升高。可見,I/O並沒有變化,%iowait 卻升高了,原因僅僅是CPU的空閒時間增加了。請記住,系統中有成百上千的進程數,任何一個進程都可以引起CPU和I/O的變化,因爲 %iowait、%idle、%user、%system 等這些指標都是全局性的,並不是特指某個進程。

iowait
再往下看第二張圖,它描述了另一種情形:假設CPU的繁忙狀況保持不變的條件下,即使 %iowait 升高也不能說明I/O負載加重了。
如果2個I/O請求依次提交、使得整個時段內始終有I/O在進行,那麼 %iowait 是100%;
如果3個I/O請求同時提交,因爲系統有能力同時處理多個I/O,所以3個併發的I/O從開始到結束的時間與一個I/O一樣,%iowait 的結果只有50%。
2個I/O使 %iowait 達到了100%,3個I/O的 %iowait 卻只有50%,顯然 %iowait 的高低與I/O的多少沒有必然關係,而是與I/O的併發度相關。所以,僅憑 %iowait 的上升不能得出I/O負載增加 的結論。

iowait

 

這就是爲什麼說 %iowait 所含的信息量非常少的原因,它是一個非常模糊的指標,如果看到 %iowait 升高,還需檢查I/O量有沒有明顯增加,avserv/avwait/avque等指標有沒有明顯增大,應用有沒有感覺變慢,如果都沒有,就沒什麼好擔心的。

轉自:http://linuxperf.com/?p=33


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