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はどのように簡単に見つけることができますか?この「保留中のIO」ステータスはどのように確認されますか?
ベストアンサー1
CPUはこれを知らず、タスクスケジューラは知っています。
あなたが引用した定義は多少誤解を招く可能性があります。procfs(5)
マンページより正確な定義がありますが、いくつかの注意事項があります。
iowait
(Linux 2.5.41以降)(5) I/O が完了するのを待つ時間です。この値は、次の理由で信頼できません。
CPUは、I / Oが完了するのを待たず、ジョブが
iowait
I / Oが完了するのを待つ時間です。完了していないジョブI / OによってCPUがアイドル状態になると、そのCPUに他のジョブがスケジュールされます。マルチコアCPUでは、I / Oが完了するのを待つタスクはどのCPUでも実行されないため、
iowait
CPUあたりの値を計算することは困難です。場合によっては、このフィールドの値が小さくなることがあります。
iowait
一般に、I/O を待つのに要した時間を測定します。追跡されない渡す特定のCPUであっても、そうでないかもしれません(上記の2番の項目 - 知りたい内容にも適しています)。正確にジャムすべてCPUですが、できるだけ多く。
ジョブ・スケジューラーは、I/O を待っている特定のジョブがあることを知っているため、保留中の I/O があることを「認識」します。これはin_iowait
ドメイン内の各タスクについて追跡されますtask_struct
。in_iowait
スケジューラコア設定、追跡、削除方法を確認してください。Linuxの負荷平均に関するBrendan Greggの最近の記事有用な背景情報が含まれています。タイマティックが考慮され、CPUの現在のプロセスがアイドル状態になるたびに、項目iowait
(/proc/stat
および最終的に項目)が増加top
しますaccount_idle_time
。スケジューラ用CPU時間追跡コード。
したがって、より正確な定義は、「より良いことがないときにCPUがI / Oを待つのに費やす時間」です。