4

我有一系列的工作需要完成;作业之间没有依赖关系。我正在寻找一种工具来帮助我将这些工作分配给机器。唯一的限制是每台机器一次只能运行一个作业。我正在尝试最大化吞吐量,因为工作不是很平衡。由于我预先构建了每台机器的作业队列,我目前的组合 shell 脚本效率较低,并且无法将作业从负载繁重的机器的队列移动到正在等待的机器,已经完成了所有工作。

以前的建议包括 SLURM,这看起来有点过分,甚至更过分的 LoadLeveller。

GNU Parallel 看起来几乎正是我想要的,但是远程机器不支持 SSH;使用了一个自定义作业启动器(没有排队功能)。我想要的是 Gnu Parallel,其中机器可以在调度作业之前动态替换为 shell 脚本。

所以,总结一下:

  • 作业列表+可以接受的机器列表:最大化吞吐量。尽可能靠近外壳是首选。

在最坏的情况下,某些东西可以与 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

并运行一个实例

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

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 回答