私は、データ ストレージのニーズに NFS を使用するクラスターのユーザーです。最近、一部の操作中に I/O が非常に高くなるパイプラインを実行しています。
問題の原因と思われるプログラムは、Bowtie というバイオインフォマティクス パイプラインのアライナーです。簡単に言うと、断片化されたファイル内に 100 万行のアルファベット シーケンスがあり、それを辞書全体を含む別のファイルと比較します。(これはアルゴリズムを過度に単純化したものです)
この辞書は、手順中にメモリにマップされます。クラスター上の 3 つのノードに対してキュー送信権限を持っています。
ノード: ノード1 ノード2 ノード3 ノード4 ノード5 ノード6 ノード7
私の右: ノード1 ノード2 ノード3
使用可能なプロセッサの数: 128 個のプロセッサまたは 128 個の実行キュー スロット。
クラスター上で実行するために、メイン ファイルは 100 万行ずつのチャンクに分割され、すべてのジョブは SGE を使用して開始されます。
この時点で辞書は各ノード(ノード1、2、3)のメモリにロードされます。
キュースロットでアクティブなジョブごとに、次のファイルハンドラーが開かれます。
実行するコードを含むジョブファイル 1 つ、プロセスの終了コードを含むコードファイル 1 つ、SGE で生成された STDOUT ファイル 1 つ、SGE で生成された STDERR ファイル 1 つ、ファイルチャンク 1 つ、出力ファイル 1 つ
つまり、このプロセス中は、最初の 4 つのファイルはパイプライン内のすべてのスクリプトに対して一定ですが、リモート データ ストレージ上で 768+3 個のファイル ハンドラーが開かれます。
これが起こると、データ ストレージ上の NFS サーバーがクラッシュし、ストレージが応答しなくなるため、クラスター全体がダウンします。
当社の IT 担当者は、このプロセス中に I/O が大量に発生したことが原因である可能性があり、NFS は大規模なクラスターではなく小規模なクラスターのみを対象としていた可能性があると示唆しています。
そのため、私たちはこのプロセスをノードの 1 つ自体で実行するという解決策を講じました。しかし、その場合、すべてのクラスターで共有されるデータ ストレージではなく、ノードのディスクに書き込むことになるため、クラスターを自由に使用できるという利点が失われます。
NFS が小規模なクラスター向けに構築され、大規模なエンタープライズ規模のソリューションに一度も正常に実装されたことがないとは信じられません。NFS が突然ネットワーク接続を切断する別の理由があるのでしょうか?
問題のプロセスがクラスターのフリーズの原因であることは確かですが、そのプロセスが要求する読み取り/書き込み速度が障害の原因であるとは確信していません。これまでにこのような問題を経験した方はいらっしゃいますか? 完全なプロトコル移行が唯一の解決策でしょうか?
答え1
長年にわたり学んだいくつかの提案。
- NFS サーバーの負荷を最小限に抑えます。
NFS エクスポート オプションを設定します。async,insecure,no_subtree_check
NFSマウントオプションを設定するsoft,noatime,nodiratime,nolock,vers=3
また、noatime,nodiratime
データ/tmp/スクラッチマウントにも設定します。負荷を軽減するために、NFS 暗号化がオフになっていることを確認します。NFS ロック プロセスを停止します。
すべてのホスト上のネットワークに対して JUMBO フレームを有効にしてみます (ネット機器でサポートされている場合) - MTU を 9k 程度に設定します。
ランダム書き込み IO には必ず RAID10 ストレージを使用してください (RAID5/6 は絶対に使用しないでください)。SSD はありますか?
開いている FS ハンドルの数を最大化します (一部のシステムではデフォルトは 2K)。これを 1M 程度に設定します。
入力データを含むマッピング データベースをローカル スクラッチ ノード ストレージにコピーし、結果の SAM ファイルを別の手順として結合/並べ替える可能性はありますか?
処理されるチャンクのサイズを増やします (少なくとも 30 分以上処理されるようにします)。
もし可能なら可能な限り高いレベルでジョブを分割する(10 台のホストを使用して各ゲノムを順番にマッピングするのではなく、10 個の個別のゲノム/サンプルを 10 個の異なるノードで並行してマッピング/ソートしてみてください)。すべてのプロセスが完了したら、チェックポイントを試みます。
プログラム ソースを変更して、4k ではなく 1M などの大きなチャンクでデータを読み取ります。
CPU/RAM 相互接続の競合に注意してください (特に AMD 4-8 ソケット システム)。48 コア ボックスで 12-24 スレッドを実行すると、48 スレッドよりはるかに高速になる場合があります。さまざまな使用率レベルを試してください。NUMA がオンになっており、マルチ CPU システム用に構成されていることを確認してください。NUMA を有効にして再コンパイルしてください。
PS: 効率的なクラスターの管理は、1,000 人以上の作業員がいる建設現場の計画/管理に似ています...