恥ずかしいほど並列の問題があります。それぞれに異なるデータセットを使用して、単一のプログラムの多数のインスタンスを実行します。これを行うには、アプリケーションを毎回異なるパラメータでバッチ キューに何度も送信します。
ただし、多数のジョブがある場合、すべてのジョブが完了するわけではありません。キューの問題ではないようです。すべてのジョブが開始されています。
問題は、実行中のアプリケーションの多数のインスタンスで、多くのジョブがほぼ同時に終了し、そのためすべてのジョブがほぼ同時に並列ファイル システムにデータを書き込もうとすることです。
問題は、プログラムがファイルシステムに書き込むことができず、何らかの方法でクラッシュするか、書き込みを待っているだけで、長時間待機した後にバッチキューシステムがジョブを強制終了することです。(私が問題について収集したものから、すべてではないにしても、完了に失敗したジョブのほとんどは、コア ファイルを残しません)
この問題を回避するためにディスク書き込みをスケジュールする最善の方法は何ですか? 各プロセスが他のプロセスを認識していないという事実を強調するために、私たちのプログラムは恥ずかしいほど並列であることに言及します-何らかの方法で書き込みをスケジュールするために互いに通信することはできません。
私はプログラムのソースコードを持っていますが、私たちはそれを維持または開発していないので、可能であればこれを変更することなく問題を解決したいと考えています (コメントのほとんどはイタリア語です)。
私はこの問題についていくつかの考えを持っています:
- 各ジョブは、最初にノードのローカル (スクラッチ) ディスクに書き込みます。次に、どのジョブが完了したかをときどきチェックし、ファイルをローカル ディスクから並列ファイル システムに移動する別のジョブを実行できます。
- マスター/スレーブ システムでプログラムの周りに MPI ラッパーを使用します。マスターはジョブのキューを管理し、これらを各スレーブにファームします。スレーブ ラッパーはアプリケーションを実行し、例外をキャッチし (C++ または Java のファイル システム タイムアウトに対してこれを確実に実行できますか?)、ジョブを再実行するようにメッセージをマスターに送り返します。
それまでの間、エラー自体の詳細についてスーパーバイザーをせがむ必要があります。個人的にエラーに遭遇したことはありませんが、非常に多数のデータセットに対してプログラムを使用する必要はありませんでした (まだ)。
参考までに、SGE (Sun GridEngine) バッチ キュー システムを備えた HPC システムで Solaris を実行しています。ファイルシステムは NFS4 で、ストレージサーバーも Solaris を実行しています。HPC ノードとストレージ サーバーは、ファイバー チャネル リンクを介して通信します。