Linux

CPU 怎麼知道有 IO 掛起?

  • December 14, 2017

我一直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 完成的時間。該值不可靠,原因如下:

  1. CPU 不會等待 I/O 完成;iowait是任務等待 I/O 完成的時間。當一個 CPU 因未完成的任務 I/O 進入空閒狀態時,另一個任務將被安排在該 CPU 上。
  2. 在多核 CPU 上,等待 I/O 完成的任務不在任何 CPU 上執行,因此iowait每個 CPU 的 t 都難以計算。
  3. 在某些情況下,此欄位中的值可能會減小。

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 所花費的時間”……

引用自:https://unix.stackexchange.com/questions/410628