1

非常に大きな入力データと非常に大きな出力データ (両方ともメモリのサイズを超える) を持つデータ処理コード (C で記述) があります。処理を行うには、入力データの一部のみを読み込み、処理後に出力データの一部のみを出力する必要があります。私たちの設計では、メモリの一部に入力データのセグメントを保持し、出力データの最初の部分を計算し (ほぼメモリをいっぱいにします)、出力を (write または fwrite を使用して) ローカル ディスクに書き込みます。現在のノード。次に、コードは出力データの次の部分を計算し、メモリ内の入力データから可能なすべての出力が計算されて出力されるまで、それを書き出します。

私たちは多くの独立したクラスターに取り組んでおり、ほとんどの場合、個々の出力が完了するまでに数秒かかります。しかし、私たちが遭遇した 2 つのシステムでは、ローカル ディスクへの書き込み (バッファへの書き込みかディスクへの書き込みかを問わず) が開始/終了しないので、コードが停止します。彼らは何分も何時間も座っていて、何もしません。これは、一部のノードでのみ、一部の時間だけ発生し、書き込みの遅延はさまざまです (数分から数時間)。そのままにしておくと、他のノードで同じ問題が発生し始める可能性がありますが、問題があったノードでは突然問題が発生しなくなります。

非常に奇妙な回避策を発見しました。比較的大きなファイル (1 Gb) を定期的にローカル ディスクにコピーするバックグラウンド ループを設定しました。外部コピーが開始されると、C コードでの書き込みがすぐに開始されます (IOSTAT の I/O が突然発生することがわかります)。これは、コピーするファイルが十分に大きい場合にのみ機能します。これはもちろん、処理の効率を大幅に低下させることを意味します。

この問題が発生した 2 つのクラスターは、まったく異なるグループによってセットアップされ、異なるハードウェア、ネットワークなどを使用しており、この問題が発生していないクラスターは、これらの両方のクラスターと類似点があります。この非常に基本的な書き込みが停止する理由について、明らかな原因はわかりません。問題が存在する 2 つのクラスターでは、一部のノードで他のノードより頻繁に問題が発生しますが、問題がない場合もあります。実行中は他に何も実行されていません。

ヘルプや提案をいただければ幸いです。

4

0 に答える 0