CPUはIO保留中をどのように知るのですか?


17

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のいずれかがそのプロセスをスリープ状態にした可能性があるため、CPUがIOが完了するまでに何らかのプロセスがスリープ状態になったことを単純に見つける方法はありますか。「保留中のIO」のこのステータスはどのように確認されますか?


3
「プロセスは単一のCPUで実行されます」。あんまり。スレッドは単一のCPUコアで実行されますが、最新のプロセスには複数のスレッドがあり、最新のCPUには複数のコアがあります。
MSalters

@MSaltersそして、それでも、1つのスレッドはいつでも1つのコアでしか実行できませんが、実行するコアはコンテキストの切り替え後に変更される可能性があります。
JAB

1
そこ割り込み要求(IRQ)と呼ばれるこの事だが、我々が興味を持っているよりも、おそらくより多くのハードウェアである。
mathreadler

回答:


33

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の計算は困難です。

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

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

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

そのため、より正確な定義は、「このCPUがI / Oを待機するのに費やした時間で、これ以上良いことはありません」...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.