理解 %IOWAIT (%WIO)
%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.
- 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 的首要條件就是CPU空閒,既然空閒當然就可以接受執行任務,只是因為沒有程式可以執行,CPU才進入空閒狀態的。那為什麼沒有程式可以執行呢?因為程式都處於休眠狀態、在等待某個特定事件:比如等待定時器、或者來自網路的資料、或者鍵盤輸入、或者等待I/O操作完成,等等。
- 是誤以為 %iowait 表示I/O有瓶頸問題
- 為什麼人們會認為 %iowait 偏高是有I/O問題的跡象呢?他們的理由是:”%iowait 的第一個條件是CPU空閒,意即所有的程式都在休眠,第二個條件是仍有未完成的I/O請求,意味著程式休眠的原因是等待I/O,而 %iowait 升高則表明因等待I/O而休眠的程式數量更多了、或者程式因等待I/O而休眠的時間更長了。“ 聽上去似乎很有道理,但是不對:首先 %iowait 確實表示CPU空閒、所有程式都在休眠,也確實有的程式在等待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 等這些指標都是全域性性的,並不是特指某個程式。
再看第二張圖,它描述了另一種情形:假設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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 效能分析(4)- iowait 使用率過高案例AI
- 聊一聊被眾人誤解許久的 iowaitAI
- 理解 this
- 理解sizeof
- ThreadLocal理解thread
- YYCache理解
- 理解ContextContext
- 理解MeasureSpec
- 理解TypeScriptTypeScript
- BFC理解
- 理解BFC
- pm 理解
- LSTM理解
- Socket理解
- Socket 理解
- zookeeper理解
- Runtime理解
- 理解haslayout
- 理解 HTTPHTTP
- 理解CSSCSS
- 理解CAS
- MapReduce理解
- 理解SpingAOP
- Android Https 理解AndroidHTTP
- 如何理解Axis?
- 全面理解GitGit
- 理解 HandlerThread 原理thread
- React Diff理解React
- 理解 React HooksReactHook
- 理解Android BitmapAndroid
- 理解原型鏈原型
- 理解 AsyncTask 原理
- 理解 IntentService 原理Intent
- 如何理解nexus
- RAC的理解
- 理解RESTful概念REST
- Reactor模式理解React模式
- 理解索引(上)索引