以下に示すように、トップユーティリティの出力に表示される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が完了しなかったため、スケジュールされませんでした)、「保留中のIO」があることをCPUはどのようにして知るのでしょうか?そのような情報はどこから取得されますか?CPUは、あるプロセスがIO =いずれかのCPUがそのプロセスをスリープ状態にする可能性があるため、完了します。この「保留中のIO」のステータスはどのように確認されますか?
CPUはこれを認識していませんが、タスクスケジューラは認識しています。
あなたが引用する定義はやや誤解を招くものです。現在の procfs(5)
manpage には、より正確な定義がありますが、注意点があります:
iowait
(Linux 2.5.41以降)(5)I/Oが完了するのを待つ時間。次の理由により、この値は信頼できません。
CPUはI/Oが完了するのを待ちません。
iowait
は、タスクがI/Oの完了を待機している時間です。未解決のタスクI/OのためにCPUがアイドル状態になると、このCPUで別のタスクがスケジュールされます。マルチコアCPUでは、I/Oの完了を待機しているタスクはどのCPUでも実行されていないため、各CPUの
iowait
を計算することは困難です。このフィールドの値は、特定の条件で減少する場合があります。
iowait
は、一般的に、I/Oの待機に費やされた時間を測定しようとします。特定のCPUによって追跡されないこともできません(上記のポイント2 —これは、疑問に思っていることにも一致します)。ただし、可能な限り、CPUごとにCPUで測定されます。
タスクスケジューラは保留中のI/Oがあることを「認識」します。これは、I/Oを待機しているため、特定のタスクを中断したことがわかっているためです。これは、in_iowait
のtask_struct
フィールドでタスクごとに追跡されます。 scheduler core でin_iowait
を検索して、設定、追跡、およびクリアされる方法を確認できます。 Brendan GreggによるLinuxの負荷平均に関する最近の記事 には、有用な背景情報が含まれています。 iowait
で終わる/proc/stat
のtop
エントリは、タイマーティックが考慮され、CPUが「オン」の現在のプロセスがアイドル状態になるたびにインクリメントされます。 スケジューラのCPU時間追跡コード でaccount_idle_time
を検索すると、これを確認できます。
したがって、より正確な定義は、「このCPUがI/Oを待機するのに費やされた時間で、他に何もすることがない場合」です...