Linux 上的批处理

And*_*ams 3 linux batch scheduling batch-processing

在业务中的另一个流程完成后,我们目前正在设置服务器以进行一些繁重的工作 (ETL),目前我们正在通过计划的 cron 作业或远程执行(通过 ssh)来启动作业。本周早些时候,我们遇到了系统上并行运行的作业过多的问题,这导致所有作业在争夺 CPU 时间时都以蜗牛般的速度运行。

我一直在寻找一个批处理调度程序,一个我们可以将作业插入运行队列的系统,系统将一个一个地处理它们。任何人都可以就一个程序/系统提出建议吗?由于该项目的鞋带性质,低成本 / FOSS 将受到赞赏。

Mar*_* M. 6

我会设置某种排队服务。一个关于“准备使用”的快速谷歌显示了这一点:

根据您的需要,您可以简单地

  • 创建一个用户提交作业的包装器,
  • 包装器将作业写入套接字/文件/任何东西
  • 创建一个通过作业运行作业等待它完成的消费者
  • 然后消费者被 cron 定期调用(每 5 分钟左右)
    • 当然创建一些锁定机制,以便一次只运行 n 个作业(其中 n=>1)
  • 如果没有更多的工作,什么都不做
  • 如果有更多的工作抓住下一个并等待它完成

实际上还有更多内容,您可能需要实现优先级队列,这会带来诸如饥饿作业或类似问题之类的问题,但让某些东西快速启动并运行并没有那么糟糕。

如果 LDP 按照womble 的建议,我会接受。拥有这样一个由更大社区维护的系统当然比为其他人已经解决的问题创建自己的错误更好:)

排队服务还具有将资源与实际数字运算分离的优势。通过在某些网络连接上提供作业,您可以简单地将硬件放在(可能的)扩展问题上,并获得几乎无限的可扩展性。


Dan*_*ley 5

两个解决方案浮现在脑海中:

  1. 使用xargs -P在同一时间控制最大并行处理。
  2. 创建一个 Makefile 并使用make -j.

它们实际上都在这个SO 线程中进行了更详细的总结。

这些可能不适用于您的脚本结构。


rkt*_*hkr 5

您的问题的一个重量级解决方案是使用类似Sun Grid Engine的东西。

Sun Grid Engine (SGE)。SGE 是一个分布式资源管理软件,它可以有效地利用集群/机器内的资源(cpu 时间、软件、许可证等)。

是一个关于如何使用 SGE 的小教程。