700台のネットワークデバイスでいくつかのタスクを完了するには、Expectスクリプトを使用する必要があります。順次終了することはできますが、現在までのランニングタイムが24時間程度になりますね。これは、主に接続を確立するのにかかる時間と、これらのデバイス(以前のデバイス)の出力待ち時間によるものです。 2つの接続を確立して並列に実行できますが、それをどれだけ延長できますか?
700の作業を同時に完了することはできないようですが、もちろん「いいえ」にも限界があります。私の仮想マシンが管理できるTelnet接続の数。
次のような一種のループで700個を起動しようとすると、次のようになります。
for node in `ls ~/sagLogs/`; do
foo &
done
そして
CPU 12 CPU x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz
メモリ 47.94GB
私の質問は次のとおりです
- 700個のインスタンスをすべて同時に実行できますか?
- サーバーが制限に達する前にどこに行くことができますか?
- その制限に達すると、次の繰り返しが始まるのを待ちますか
foo
、それとも競合が発生しますか?
残念ながら、私はエンタープライズプロダクション環境で実行しているので、正確に試してみて、何が起こっているのかを確認することはできません。
ベストアンサー1
700個のインスタンスをすべて同時に実行できますか?
同時の意味によって異なります。私たちが面倒なら、システムに700の悪用可能な実行スレッドがない限り(おそらくそうではありません)、彼らはそうすることはできません。しかし、現実的には、システムに十分なRAMおよび/またはスワップスペースがある限り、おそらくそうです。 UNIXとそのさまざまなサブシステムは、大量の並行性を管理するのに非常に優れています。これは、UNIXが大規模HPCの使用に広く使用されている理由の1つです。
サーバーが制限に達する前にどこに行くことができますか?
追加情報がなければ、具体的に答えることはできません。以下を満たすには十分なメモリが必要です。
- ジョブのフルランタイムメモリー要件は700倍です。
- bashは非常に多くのタスクに必要なメモリを管理します(bashはこれを悪くしませんが、タスク制御は完全に効率的ではありません)。
- システムのその他のメモリ要件。
この要件を満たしていると仮定すると(再び、RAMが50 GBしかない場合でも、他の問題に対処する必要があります)。
- bashはジョブ制御にどのくらいのCPU時間を無駄にしますか?それほど多くないかもしれませんが、何百もの仕事についてはかなりのことかもしれません。
- これにはどの程度のネットワーク帯域幅が必要ですか?これらの接続をすべて開くだけで、帯域幅と待ち時間によってネットワークが数分間暴走する可能性があります。
- 私が思わなかったことが多いかもしれません。
その制限に達すると、次のfooの反復が開始されるのを待つか、それとも競合が発生しますか?
どの制限に達したかによって異なります。メモリの場合、システムの何かが死ぬか(具体的にはメモリを解放しようとしている間にカーネルによってシャットダウンされます)、システム自体がクラッシュする可能性があります(メモリが不足したときに意図的にクラッシュするようにシステムを設定することはまれです)。 。 CPU 時間であれば問題なく実行されますが、システムで他の操作を実行することはできません。ネットワークの問題の場合、競合が発生する可能性があります。その他システムまたはサービス。
あなたは何ですか本物ここで必要なのは、すべてのジョブを同時に実行するわけではありません。代わりに、バッチに分割し、バッチ内のすべてのジョブを同時に実行して完了し、次のバッチを開始します。 GNU並列(https://www.gnu.org/software/parallel/)をこの目的に使用できますが、本番環境ではこの規模では理想的ではありません(使用している場合は、ネットワークがあふれ、他の方法では触れられないシステムに影響を与える可能性があると述べたように、あまりにも攻撃的ではありません)。 Ansibleなどの適切なネットワーク調整ツールを確認することをお勧めします(https://www.ansible.com/)これは並行性の問題を解決するだけでなく(Ansibleは上記のバッチ処理を自動化します)、他の多くの有用な機能(例えば、タスクのべき等性の実行、良好なステータスレポート、および他の多くのツールとの統合)も提供します。 )。