リモートコンピュータでスクリプトを並列に実行するには?

リモートコンピュータでスクリプトを並列に実行するには?

SSHを介して64コアのリモートコンピュータに接続できます。このコンピュータで640個のシェルスクリプトを並列に実行する必要があるとします。どうすればいいですか?

640個のスクリプトがそれぞれ10個のスクリプトで構成される64個のグループに分かれていることがわかります。その後、各グループをどのように実行しますか?平行につまり、利用可能な各コアに1つのグループがあります。

フォームのスクリプトはありますか?

    ./script_A &
    ./script_B &
    ./script_C &
    ...

script_A最初のグループ、2番目のグループなどに対応するものは何script_Bですか?十分ですか?

1 つのコアで実行されるグループ内のスクリプトは順次実行できますが、グループをすべてのコアで並列に実行したいと考えています。

答え1

これはGNU並列操作のように見えます。

parallel bash -c ::: script_*

利点は、スクリプトをコア別にグループ化する必要がないことです。parallel私たちが代わっています。

もちろん、スクリプトの実行中にSSHセッションをホストしたくない場合は、nohupまたはを使用する必要があります。screen

答え2

このアプローチは、出力を監視する必要がなく、スクリプトの実行中にSSHセッションを開いたままにできる限り機能します。これらのいずれかが間違っている場合は、複数のscreenタブを使用することをお勧めします。次のようなことができます

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

答え3

多数のスクリプト操作を開始および管理するには、リソース使用量(CPU、メモリ、優先順位)を制御し、ジョブの状態(待機中、保留中、実行中、完了)を確認する一種の管理ソフトウェアが必要です。

グリッドエンジンはこの目的のために構築されました。たとえば、Sun Grid Engine(http://wiki.gridengine.info/wiki/index.php/Main_Page)またはオープングリッドスケジューラ(http://gridscheduler.sourceforge.net/)。始める前に、管理者は適切なソフトウェアをインストールする必要があります。管理者は、コンピュータで実行されている何百ものプロセスを表示して制御できないよりも、これを行う方が良いかもしれません。

通常、管理者はシステムをいくつのスロットに分割できるかを定義します。キューにジョブを送信し、ジョブが使用するスロット数を指定すると、Grid Engine はシステムの全体的な使用量を監視し、それに応じてジョブを実行します。状況。管理者がキュー戦略を定義しました。たとえば、同時に複数のジョブを実行することはできません。残りのジョブはキューで待機し、前のジョブが完了した後に解放されます。

答え4

私はこれを何度もやってきましたが、一般的には、タスクコントロールを介してタスクを実行するためにスクリプトを直接書いています。通常、ファイルで実行するすべてのスクリプトの名前がある場合、解決策は次のとおりです。

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

それは無差別的な力ですが、動作します。さらに、システムに追加のソフトウェア(並列処理など)を追加する必要はありません。

大きな問題は、waitコマンドが最も遅いスクリプトが完了するのを待つため、時間が無駄になる可能性があることです。私はこの状況を処理するためにスクリプトを作成しましたが、あなたが想像できるように、スクリプトはより複雑になります。このアプローチは、すべてのスクリプトを実行するのにほぼ同じ時間がかかる場合に適しています。

別の問題は、最適なパフォーマンスを決定するためにMAX_PROCSを調整する必要があることです。

もちろん、SSH接続の数が管理するのが難しくなる可能性があります。この場合、このスクリプトをリモートホストに移動し、「ssh...」行を変更してスクリプトを直接実行します。

関連情報