web-dev-qa-db-ja.com

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が完了しなかったため、スケジュールされませんでした)、「保留中のIO」があることをCPUはどのようにして知るのでしょうか?そのような情報はどこから取得されますか?CPUは、あるプロセスがIO =いずれかのCPUがそのプロセスをスリープ状態にする可能性があるため、完了します。この「保留中のIO」のステータスはどのように確認されますか?

17
Alchemist

CPUはこれを認識していませんが、タスクスケジューラは認識しています。

あなたが引用する定義はやや誤解を招くものです。現在の procfs(5) manpage には、より正確な定義がありますが、注意点があります:

iowait(Linux 2.5.41以降)

(5)I/Oが完了するのを待つ時間。次の理由により、この値は信頼できません。

  1. CPUはI/Oが完了するのを待ちません。 iowaitは、タスクがI/Oの完了を待機している時間です。未解決のタスクI/OのためにCPUがアイドル状態になると、このCPUで別のタスクがスケジュールされます。

  2. マルチコアCPUでは、I/Oの完了を待機しているタスクはどのCPUでも実行されていないため、各CPUのiowaitを計算することは困難です。

  3. このフィールドの値は、特定の条件で減少する場合があります。

iowaitは、一般的に、I/Oの待機に費やされた時間を測定しようとします。特定のCPUによって追跡されないこともできません(上記のポイント2 —これは、疑問に思っていることにも一致します)。ただし、可能な限り、CPUごとにCPUで測定されます。

タスクスケジューラは保留中のI/Oがあることを「認識」します。これは、I/Oを待機しているため、特定のタスクを中断したことがわかっているためです。これは、in_iowaittask_structフィールドでタスクごとに追跡されます。 scheduler corein_iowaitを検索して、設定、追跡、およびクリアされる方法を確認できます。 Brendan GreggによるLinuxの負荷平均に関する最近の記事 には、有用な背景情報が含まれています。 iowaitで終わる/proc/stattopエントリは、タイマーティックが考慮され、CPUが「オン」の現在のプロセスがアイドル状態になるたびにインクリメントされます。 スケジューラのCPU時間追跡コードaccount_idle_timeを検索すると、これを確認できます。

したがって、より正確な定義は、「このCPUがI/Oを待機するのに費やされた時間で、他に何もすることがない場合」です...

33
Stephen Kitt