web-dev-qa-db-ja.com

あまりにも多くのバックグラウンドジョブを開始するとどうなりますか?

Expectスクリプトを使用して、700のネットワークデバイスでいくつかの作業を行う必要があります。順次実行できますが、これまでの実行時間は約24時間です。これは主に、接続の確立にかかる時間とこれらのデバイス(古いデバイス)からの出力の遅延が原因です。 2つの接続を確立し、それらを並列でうまく実行させることができますが、どれだけ遠くまでプッシュできますか?

700個すべてを一度に実行できるとは思いませんが、確かに制限はあります。 Telnet接続の私のVMが管理できます。

私がこれらのようなループで700個を開始しようとした場合:

for node in `ls ~/sagLogs/`; do  
    foo &  
done

  • CPU 12 CPU x Intel(R)Xeon(R)CPU E5649 @ 2.53GHz

  • メモリ47.94 GB

私の質問は:

  1. 700のインスタンスすべてが同時に実行される可能性はありますか?
  2. サーバーが限界に達するまで、どのくらい遠くまで行けますか?
  3. その制限に達すると、fooの次の反復が始まるのを待つだけですか、それともボックスがクラッシュしますか?

私は残念ながら企業の本番環境で実行しているので、何が起こっているのかを正確に確認することはできません。

13
KuboMD

700のインスタンスすべてが同時に実行される可能性はありますか?

それはあなたが同時に何を意味するかによります。私たちがうるさいのであれば、いいえ、システムで700の実行スレッドを利用できる場合を除いて、そうすることはできません(おそらくそうではありません)。現実的には、そうです、システムに十分なRAMおよび/またはスワップスペースがある場合、それらはおそらく可能です。UNIXとそのさまざまな子は、非常に高いレベルの同時実行性の管理に非常に優れています。大規模なHPCの使用で人気がある理由。

サーバーが限界に達するまで、どのくらい遠くまで行けますか?

これは、より多くの情報なしに具体的に答えることは不可能です。ほとんどの場合、満たすのに十分なメモリが必要です。

  • 1つのジョブの実行時メモリ要件全体の700倍。
  • その多くのジョブを管理するためのbashのメモリ要件(bashはこれについて恐ろしいことではありませんが、ジョブ制御は正確にメモリ効率が良いわけではありません)。
  • システム上のその他のメモリ要件。

あなたはそれを満たしていると仮定します(ここでも、RAMが50GBしかないため、他の問題に対処する必要があります:

  • ジョブ制御のbashによってどれだけのCPU時間が無駄になるでしょうか?おそらくそれほど多くはありませんが、何百もの仕事があるので、それは重要になる可能性があります。
  • これにはどれくらいのネット​​ワーク帯域幅が必要になるのでしょうか?これらの接続をすべて開くだけでは、帯域幅とレイテンシに応じて、ネットワークが数分間占有される場合があります。
  • 私がおそらく考えていない他の多くのこと。

その制限に達すると、fooから次の反復が始まるのを待つだけですか、それともボックスがクラッシュしますか?

どの制限に達したかによって異なります。メモリの場合、システムで何かが死ぬか(より具体的には、メモリを解放しようとしてカーネルによって強制終了される)、またはシステム自体がクラッシュする可能性があります(メモリが不足したときに意図的にクラッシュするようにシステムを構成することは珍しいことではありません)。それがCPU時間である場合は、問題なく続行され、システムで他の多くのことを実行することは不可能です。ただし、ネットワークの場合は、otherシステムまたはサービスがクラッシュする可能性があります。


ここで本当に必要なのは、すべてのジョブを同時に実行することではありません。代わりに、それらをバッチに分割し、バッチ内のすべてのジョブを同時に実行し、それらを完了させてから、次のバッチを開始します。 GNU Parallel( https://www.gnu.org/software/parallel/ )はこれに使用できますが、そのスケールでは理想的ではありません本番環境(これを使用する場合は、先ほど述べたように攻撃的になりすぎないでください。ネットワークを圧迫し、他の方法では影響を受けないシステムに影響を与える可能性があります。)Ansibleなどの適切なネットワークオーケストレーションツール( https://www.ansible.com/ )、これは同時実行の問題を解決するだけでなく(Ansibleは上記のようなバッチ処理を自動的に実行します)、他にも多くの便利な機能を提供しますで作業する(タスクのべき等実行、Niceステータスレポート、他の多数のツールとのネイティブ統合など)。

17

記述した方法でバックグラウンドジョブとして実行できるインスタンスの数を具体的に述べるのは困難です。しかし、通常のサーバーは、正しく実行する限り、確実に700の同時接続を維持できます。 Webサーバーは常にこれを行います。

GNU parallel( https://www.gnu.org/software/parallel/ )またはこれに類似した何かを使用してこれを達成することをお勧めしますか?バックグラウンドジョブアプローチには多くの利点があります。

  • 同時セッション数は簡単に変更できます。
  • そして、セッションが完了するまで待ってから新しいセッションを開始します。
  • 中止する方が簡単です。

クイックスタートについては、こちらをご覧ください: https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source

12
laenkeio

並列処理に&を使用することは、いくつかを実行するとき、および進行状況を監視するときにうまくいきます。ただし、企業の運用環境で実行している場合は、より適切に制御できるものが必要です。

ls ~/sagLogs/ | parallel --delay 0.5 --memfree 1G -j0 --joblog my.log --retries 10 foo {}

これにより、~/sagLogsの各ファイルに対してfooが実行されます。 0.5秒ごとにジョブを開始します。1GB RAMが空いている限り、できるだけ多くのジョブを並行して実行しますが、システムの制限(ファイル数や通常、これは、許可されるオープンファイルの数を調整していない場合、250のジョブを並行して実行することを意味します。オープンファイルの数を調整する場合、32000を並行して実行しても問題はありません。十分なメモリ。

ジョブが失敗した場合(つまり、エラーコードを返します)、ジョブは10回再試行されます。

my.logは、ジョブが成功したかどうか(おそらく再試行後)かどうかを通知します。

10
Ole Tange

あまりにも多くのバックグラウンドジョブを開始するとどうなりますか?

システムが遅くなり、応答しなくなり、最悪の場合は応答しなくなるため、電源ボタンを押してハードリブートするのが最善です...これは、何かをrootとして実行して、それを回避する特権があった場合です。 bashスクリプトが通常のユーザー権限で実行されている場合、最初に頭に浮かぶのは/etc/security/limits.confおよび/etc/systemd/system.confおよびその中のすべての変数[理想的に言えば]preventuser(s)fromoverloadingシステム。

  • cpu = xeon E5649、つまり12 -core cpu;したがって、12個のコアの1つを100%で利用する12のプロセス用の12のコアがあります。 24個のプロセスを開始すると、12個のコアのそれぞれで50%の使用率で実行されます。700個のプロセス= 1.7%ですが、すべてが適切な時間内に正常に完了する限り、それは成功です。効率的であることは常に関連しているわけではありません。

    1. 700のインスタンスすべてが同時に実行される可能性はありますか?確かに、700は大きな数ではありません。 /etc/security/limits.conf maxprocデフォルトは、例えば4,135,275です

    2. サーバーがその制限に達するまでにどれくらいの距離が取れますか?700をはるかに超えると確信しています。

    3. Limits...スクリプトがserアカウントで開始された場合に何が起こるか(通常はrootも同様ですlimits.confほぼすべての人に当てはまります]は、スクリプトが実行しようとした直後に終了するということですfoo & 700回。次に、700fooプロセスがそれぞれ異なるpidで表示されることを期待しますが、456(乱数の選択)のみが表示され、他の244は開始されないため、セキュリティまたはsystemdの制限によってブロックされました。

100万ドルの質問:同時にいくつ実行する必要がありますか?

networkに関与していて、それぞれがtelnet接続を行うと述べましたが、cpuとramの制限を行う前に、ネットワークの制限とオーバーヘッドに遭遇すると推測しています。しかし、私はあなたが具体的に何をしているのかわかりません、おそらく700をすべて一度に開始することができますが、前のプロセスとネットワーク接続が終了してさまざまなシステム制限に基づいて閉じるまで、または自動的に何かが自動的にブロックされますシステムまたはカーネルの制限により阻止されるため、最初の500がキックオフし、残りの200はキックオフします。しかし、一度にいくつでも実行すると、可能な限り速く処理するために甘いスポットがいくつかあります...オーバーヘッドを最小限に抑え、効率を向上させます。 12コア(または2つのCPUがある場合は24)になると、12(または24)から始めて、ランタイムの改善が見られなくなるまで、同時バッチ数を12または24ずつ増やします。

ヒント: googlemax telnet connectionsそして、これがシステムにどのように適用されるかを確認してください。また、ファイアウォールについても忘れないでください。また、プロセスごとに必要なメモリの迅速な計算x 700; <利用可能RAM(ご使用の場合は約50GB))であることを確認してください。そうでない場合、システムはSWAPの使用を開始し、基本的に応答しなくなります。12、24のキック[〜 #〜] n [〜#〜]プロセスを一度に監視し、RAM空き、次に増加[〜# 〜] n [〜#〜]は、何が起こっているかについてすでにある程度の知識を持っています。

デフォルトでは、RHELは単一のホストからのTelnet接続の数を10の同時セッションに制限します。これはセキュリティ機能です... 10、/ etc/xinetd.confに設定し、「per_source」値を変更します。

1
ron