4

やらなければならない一連の仕事があります。ジョブ間の依存関係はありません。これらのジョブをマシンに分散するのに役立つツールを探しています。唯一の制限は、各マシンが一度に 1 つのジョブのみを実行する必要があることです。ジョブのバランスが取れていないため、スループットを最大化しようとしています。私の現在のハッキングされたシェルスクリプトは、マシンごとのジョブキューを事前に構築しているため効率的ではなく、負荷の高いマシンのキューから待機中のマシンにジョブを移動できず、すでにすべてが完了しています。

以前の提案には、やり過ぎのように見える SLURM と、さらにやり過ぎな LoadLeveller が含まれていました。

GNU Parallel は、私が望んでいるものとほぼ同じように見えますが、リモート マシンは SSH を話せません。カスタム ジョブ ランチャーが使用されています (キューイング機能はありません)。私が欲しいのは、ジョブがディスパッチされる直前に、その場でマシンをシェルスクリプトに置き換えることができる Gnu Parallel です。

つまり、要約すると:

  • ジョブのリスト + 受け入れ可能なマシンのリスト: スループットを最大化します。可能な限りシェルに近いことが好ましいです。

最悪の場合、bash のロックファイルと一緒に何かがハッキングされる可能性もありますが、もっと良い解決策がどこかにあるはずだと感じています。

4

2 に答える 2

2

あなたの仕事が次のjobs.tabようなテキストファイルにあると仮定します

/path/to/job1
/path/to/job2
...

dispatcher.shのようなものとして作成

mkfifo /tmp/jobs.fifo
while true; do
  read JOB
  if test -z "$JOB"; then 
    break 
  fi
  echo -n "Dispatching job $JOB .."
  echo $JOB >> /tmp/jobs.fifo
  echo ".. taken!"
done
rm /tmp/jobs.fifo

の1つのインスタンスを実行します

dispatcher.sh < jobs.tab

として作成launcher.shします

while true; do
  read JOB < /tmp/jobs.fifo
  if test -z "$JOB"; then
    break
  fi

  #launch job $JOB on machine $0 from your custom launcher

done

ターゲットマシンごとに1つのインスタンスを実行しますlauncher.sh(マシンを最初で唯一の引数として指定します)

于 2012-06-11T01:31:56.573 に答える
1

GNU Parallel は独自の ssh コマンドをサポートしています。したがって、これは機能するはずです:

function my_submit { echo On host $1 run command $3; }
export -f my_submit
parallel -j1 -S "my_submit server1,my_submit server2" my_command ::: arg1 arg2
于 2012-06-11T07:13:20.203 に答える