理解 %IOWAIT (%WIO)

大雄45發表於2022-06-17

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

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

下面是man page中的部分解釋:

 

  • Linux:

 

 

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

 

    1. 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不能工作的時間

     

     

     

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

       

      • 是誤以為 %iowait 表示I/O有瓶頸問題

       

       

       

      1. 為什麼人們會認為 %iowait 偏高是有I/O問題的跡象呢?他們的理由是:”%iowait 的第一個條件是CPU空閒,意即所有的程式都在休眠,第二個條件是仍有未完成的I/O請求,意味著程式休眠的原因是等待I/O,而 %iowait 升高則表明因等待I/O而休眠的程式數量更多了、或者程式因等待I/O而休眠的時間更長了。“ 聽上去似乎很有道理,但是不對:首先 %iowait 確實表示CPU空閒、所有程式都在休眠,也確實有的程式在等待I/O,然而 %iowait 升高並不能證明等待I/O的程式數量增多了,也不能證明等待I/O的總時間增加了。

      為什麼呢?看看下面兩張圖就明白了:
      理解 %IOWAIT (%WIO)理解 %IOWAIT (%WIO)
      第一張圖演示的是:在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 (%WIO)理解 %IOWAIT (%WIO)
      再看第二張圖,它描述了另一種情形:假設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 升高,還需檢查I/O量有沒有明顯增加,avserv/avwait/avque等指標有沒有明顯增大,應用有沒有感覺變慢,如果都沒有,就沒什麼好擔心的。

      本文地址:


      來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2901319/,如需轉載,請註明出處,否則將追究法律責任。