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は上記のバッチ処理を自動化します)、他の多くの有用な機能(例えば、タスクのべき等性の実行、良好なステータスレポート、および他の多くのツールとの統合)も提供します。 )。
答え2
説明したように、バックグラウンドジョブとして実行できるインスタンスの数を指定するのは困難です。ただし、通常のサーバーは正常に動作するだけで、700個の同時接続を確実に維持できます。 Webサーバーは常にこれを行います。
GNU Parallel(https://www.gnu.org/software/parallel/)またはこれを達成するために同様のものがありますか?バックグラウンド作業方法の多くの利点を提供します。
- 同時セッション数を簡単に変更できます。
- 新しいセッションを開始する前にセッションが完了するのを待ちます。
- これにより、流産が容易になります。
すぐに始めるにはここを見てください。https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source
答え3
&
いくつかのタスクを実行して進行状況を監視するときは、並列処理を使用することをお勧めします。ただし、エンタープライズ実稼働環境で実行する場合は、より多くの制御機能を提供する必要があります。
ls ~/sagLogs/ | parallel --delay 0.5 --memfree 1G -j0 --joblog my.log --retries 10 foo {}
これはfoo
すべてのファイルに対して実行されます~/sagLogs
。 0.5秒ごとにジョブを開始し、1 GBのRAMが利用可能な限り多くのジョブを並行して実行しますが、システム制限(ファイルやプロセス数など)に準拠しています。通常、これは、許可されている開いているファイルの数を調整しないと、250のジョブを並列に実行することを意味します。開いているファイルの数を調整する場合、メモリが十分であれば32,000個を並列に実行することも問題になりません。
操作が失敗した場合(例:エラーコードを返す)、10回再試行してください。
my.log
操作が成功したかどうかを通知します(おそらく再試行後)。
答え4
バックグラウンドで作業を始めすぎるとどうなりますか?
最悪の場合、システムが遅くなり、応答しなくなります。電源ボタンを押してハード再起動を実行する方が良いです。これにより、rootから離れる権限を持つものがrootとして実行されます。 bashスクリプトが通常のユーザー権限で実行される場合、最初に浮かぶのは/etc/security/limits.conf
[/etc/systemd/system.conf
理想的に]その中のすべての変数です。防ぐ ユーザーは以下から来ました。オーバーロードシステム。
CPU = Xeon E5649、つまり12-核兵器CPU;したがって、12個のプロセスを同時に実行する12個のコアがあり、各プロセスは100%の速度で12個のコアのうちの1つを利用します。 24個のプロセスを開始すると、各プロセスは12個のコアで50%の利用率(700個のプロセス= 1.7%)で実行されます。しかし、これはコンピュータであり、すべてが適切で適切な時間に正しく実行される限り、成功は不可能です。必ずしも重要なわけではありません。
700個のインスタンスをすべて同時に実行できますか? もちろん、700は大きな数字ではありません。
maxproc
たとえば、/etc/security/limits.conf のデフォルト値は 4,135,275 です。サーバーが制限に達する前にどこに行くことができますか? 700よりはるかに多いと思います。
限界...スクリプトが以下から始まるとどうなりますか?ユーザー[通常、ほとんどすべての人にルートが機能する]アカウントは、700回試行した後に
limits.conf
スクリプトが終了することです。foo &
金持ち各プロセスには異なるPIDがありますが、456(任意の数字の選択)のみが表示され、残りの244は一部のセキュリティまたはシステムの制限のためにブロックされ、開始されません。
百万ドルの質問:同時にいくつを実行する必要がありますか?
参加するネットワークそれぞれがTelnet接続を行うと述べたが、訓練を受けた推測によると、CPUとRAMの制限を実行する前に、ネットワークの制限とオーバーヘッドに遭遇します。しかし、正確に何をしているのかわかりません。一度に700をすべて開始できますが、以前のプロセスとネットワーク接続が完了するまで自動的にブロックされ、さまざまなシステム制限に従って終了します。そのようにして500個が始まり、残りの200個はシステムやカーネルの制限のために起動しません。しかし、同時に実行される数がいくら多くても、常に一部はあるはずです。甘いできるだけ早く作業を完了し、オーバーヘッドを最小限に抑え、効率を上げます。コアが 12 個(CPU が 2 個の場合はコア 24 個)の場合は、すぐに 12 個(または 24 個)で始まり、ランタイム改善がないまで同時配置数を 12 個または 24 個ずつ増やします。
ヒント:Google最大 Telnet 接続数そして、これがあなたのシステムにどのように適用されるかを学びます。また、ファイアウォールも忘れないでください。また、プロセスごとに必要なメモリ x 700 をすばやく計算します。空きRAM(お使いの場合は約50 GB)があることを確認してください。そうしないと、システムはSWAPの使用を開始し、本質的に応答しなくなります。だから12番と24番のキックは窒素RAMの空き容量を一度処理して監視してから増やしてください。窒素すでに何が起こっているのか、ある程度知っています。
デフォルトでは、RHELは単一のホストへのTelnet接続の数を10の同時セッションに制限します。これはセキュリティ機能です... 10に設定し、/etc/xinetd.conf、 "per_source"の値を変更します。