shell - 小规模负载均衡

标签 shell parallel-processing job-scheduling

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

之前的建议包括 SLURM,这似乎有点过头了,甚至更过头了 LoadLeveller。

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

所以,总结一下:

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

最坏的情况是某些东西可以与 bash 的锁定文件一起被黑客攻击,但我觉得某个地方必须存在更好的解决方案。

最佳答案

假设您的作业位于文本文件 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 实例(将机器作为第一个也是唯一的参数)

关于shell - 小规模负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973521/

相关文章:

c - MPI 中的雅可比松弛

parallel-processing - 在talend中运行并行作业

c# - 使用默认队列时类型不包含方法

linux - 导出的变量未反射(reflect)在 "env"输出中

linux - 在shell中,如果文件大于100MB,如何删除文件,否则移动

shell - vimdiff 与交互式 shell

python - 如何在此脚本中找到查找结果以通过电子邮件发送

java - scala/akka 性能与 java 7 fork/join

c - 如何在 OpenMP 中使用孤立的 for 循环?

java - 安排 Quartz 作业