700のインスタンスすべてをおそらく同時に実行できますか?
それはあなたが同時に意味するものに依存します。私たちがうるさいなら、利用できません(おそらくそうではありません)。ただし、システム上に十分なRAMやスワップスペースがあれば、現実的には可能です。UNIXとそのさまざまな子供たちは、膨大なレベルの同時実行性の管理に非常に優れているため、大規模なHPCの使用で非常に人気があります。
サーバーが制限に達するまで、どこまで到達できますか?
これは、さらに多くの情報なしに具体的に答えることは不可能です。ほとんどの場合、満たすのに十分なメモリが必要です。
- 1つのジョブのランタイムメモリ要件全体、700倍。
- その数のジョブを管理するためのbashのメモリ要件(bashはこれについて恐ろしいことではありませんが、ジョブ制御はメモリ効率がよくありません)。
- システム上のその他のメモリ要件。
あなたがそれを満たしていると仮定すると(再び、わずか50GBのRAMで、あなたはまだ他の問題に対処する必要があります:
- ジョブ制御のbashによって無駄になるCPU時間はどれくらいですか?おそらくそれほど多くはありませんが、何百もの仕事があるため、それは重要です。
- これに必要なネットワーク帯域幅はどれくらいですか?これらすべての接続を開くだけで、帯域幅と待機時間に応じて、ネットワークが数分間圧倒される場合があります。
- 私がおそらく考えもしなかった他の多くのこと。
その制限に達すると、fooから次の反復を開始するのを待つだけですか、それともボックスがクラッシュしますか?
どの制限に達するかによります。メモリの場合、システム上で何かが死ぬ(具体的には、メモリを解放しようとしてカーネルに殺される)か、システム自体がクラッシュする可能性があります(メモリ不足時に意図的にクラッシュするようにシステムを構成することは珍しいことではありません)。CPU時間の場合、問題なく動作し続けるだけで、システムで他のことを実行することは不可能です。ネットワークの場合は、他のシステムまたはサービスがクラッシュする可能性があります。
あなたが本当にここで必要なのは、同時にすべてのジョブを実行することではありません。代わりに、それらをバッチに分割し、バッチ内のすべてのジョブを同時に実行し、終了させてから次のバッチを開始します。これにはGNU Parallel(https://www.gnu.org/software/parallel/)を使用できますが、実稼働環境ではその規模では理想的とは言えません(それを使用する場合は、あまり攻撃的になりすぎないでください。私が言ったように、あなたはネットワークを圧倒し、さもなければ触れないシステムに影響を与えるかもしれません)。Ansible(https://www.ansible.com/のような適切なネットワークオーケストレーションツールを検討することをお勧めします。)、同時実行の問題を解決するだけでなく(Ansibleは上記のようにバッチ処理を自動的に行います)、他の多くの便利な機能(タスクのべき等の実行、素敵なステータスレポート、ネイティブの統合など)を提供します非常に多くの他のツール)。
parallel
約50の同時実行ジョブを使用して、幸運に恵まれました。これは、1から700の並列処理の間の優れた媒体です。他の良い点は、バッチレスです。停止した単一の接続は、それ自体のみを停止させ、他の接続は停止させません。主な欠点はエラー管理です。これらのシェルベースのアプローチはどれもエラーを適切に処理しません。自分で成功を手動で確認し、自分で再試行する必要があります。