CPU 怎麼知道有 IO 掛起?
我一直
iowait
在研究頂部實用程序輸出中顯示的屬性,如下所示。top - 07:30:58 up 3:37, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
iowait
一般定義如下:“這是 CPU 空閒並且有一些 IO 掛起的時間。”
據我了解,一個程序在單個 CPU 上執行。在它被取消調度後,要麼因為它已經用完它的時間槽,要麼在它被阻塞之後,它最終可以再次在任何一個 CPU 上再次被調度。
在 IO 請求的情況下,將程序置於不間斷睡眠的 CPU 負責跟踪
iowait
時間。其他 CPU 將在其端報告與空閒時間相同的時間,因為它們實際上是空閒的。這個假設正確嗎?此外,假設有一個長 IO 請求(意味著該程序有多次機會被調度但由於 IO 未完成而沒有被調度),CPU 怎麼知道有“待處理的 IO”?這種資訊是從哪裡獲取的?CPU 怎麼能簡單地發現某個程序在某個時間進入睡眠狀態以完成 IO,因為任何 CPU 都可能使該程序進入睡眠狀態。這種“pending IO”的狀態是如何確認的?
CPU 不知道這些,任務調度程序知道。
您引用的定義有些誤導;目前的
procfs(5)
聯機幫助頁有更準確的定義,但需要注意:
iowait
(自 Linux 2.5.41 起)(5) 等待 I/O 完成的時間。該值不可靠,原因如下:
- CPU 不會等待 I/O 完成;
iowait
是任務等待 I/O 完成的時間。當一個 CPU 因未完成的任務 I/O 進入空閒狀態時,另一個任務將被安排在該 CPU 上。- 在多核 CPU 上,等待 I/O 完成的任務不在任何 CPU 上執行,因此
iowait
每個 CPU 的 t 都難以計算。- 在某些情況下,此欄位中的值可能會減小。
iowait
通常,嘗試測量等待 I/O 所花費的時間。它沒有被特定的 CPU 跟踪,也不能被跟踪(上面的第 2 點——這也符合您的疑惑)。不過,它是盡可能按CPU測量的。任務調度程序“知道”有掛起的 I/O,因為它知道它掛起給定的任務是因為它正在等待 I/O。
in_iowait
這是在領域中的每個任務跟踪的task_struct
;您可以in_iowait
在調度程序核心中查找它是如何設置、跟踪和清除的。Brendan Gregg 最近關於 Linux 平均負載的文章包含有用的背景資訊。中的iowait
條目/proc/stat
,也就是中的條目,top
每當考慮到計時器滴答時就會遞增,並且目前程序“開啟”CPU 空閒;account_idle_time
您可以通過在調度程序的 CPU 時間跟踪程式碼中查找來看到這一點。所以更準確的定義應該是“在沒有更好的事情可做的情況下,在這個 CPU 上等待 I/O 所花費的時間”……