
私は現在、科学計算用のコンピュータ クラスターを管理しています。クラスター内の一部のプロセスでは、大量の IO を使用する必要があります。次のようなプロセスが見つかりました。
- 状態は DOWN と RUN の間で急速に変化し、CPU 使用率は 1% から 100% の間で急速に変化します。
- 出力では
top
、iowaitは0%、idleは約90%です
このプロセスには何らかの問題があると思われますが、プロセスの所有者は、まだディスクにデータを書き込んでいるため、プロセスは正常に実行されていると主張しています。
より詳しい情報:
- プロセスは/homeにマウントされたリモートディスクにデータを書き込んでいます
- このプロセスは、わずかに変更されたコードに基づいています。元のソフトウェアはマルチスレッドに対応していますが、大量のメモリを必要とします。変更されたコードはより多くのディスクを使用し、より少ないメモリを使用しますが、コードを変更した人はマルチスレッドについて何も知りません。
- 小さなテストでコードが正しい結果を出すことが分かる
質問:
- なぜプロセスは CPU を 100% 使用していないのでしょうか。また、それが IO の待機によるものである場合、iowait が 0% になっているのはなぜでしょうか。
- プロセスに問題があるかどうかをどのように判断しますか。また、どのような種類の問題ですか。
答え1
The process is writing data to a remote disk mounted on /home
おそらく答えはそこにあります。プロセスの状態D
は下それは中断されない睡眠これは通常、完了するまでに I/O がいくつかあることを意味します。ネットワーク共有があるため、状況によっては I/O 待機として表示されず、システムが待機している間に CPU をあまり消費しない可能性があります。
ただし、アプリケーションの書き込み方法、ネットワーク、またはファイル サーバーのパフォーマンスが原因でネットワーク共有が遅い場合、ユーザーとアプリケーションの動作は非常に遅くなります。
アプリケーションまたはネットワーク共有が原因かどうかを調べるにはどうすればよいでしょうか。簡単です。他のツールや他の使用パターンを使用して、ネットワーク共有のパフォーマンスをテストします。大量のデータを /home から他の場所へコピーしたり戻したりして、 などのベンチマークを実行しiozone
、 を使用して生のネットワーク パフォーマンスをテストしますiperf
。
適切な結果が得られた場合は、アプリケーションが何を実行しているかを確認してください。
しかし、多くの場合、理由は他の場所にあります。システムについて何も知らないので、NFS マウント設定を調整する必要があると推測します。ただし、現時点では、NFS が使用されているかどうかもわからないため、推測にすぎません。
答え2
CPU がビジーでない場合は、プロセスは外部からの何かを待っていると考えられます。strace を使用して、どのシステム コールに最も時間がかかっているかを調べると、その原因がわかる可能性が高いと思います。
その場合は、プロファイラーを使用してコードが何を実行しているかを調べてみてください。
コードでは mmap された IO を使用していますか? プロセスに対する iowait 時間としては報告されないかもしれませんが、ページをディスクにフラッシュするときに大量のディスクを使用するシステム プロセスとして表示されるのではないかと思います。