在Linux上批处理

目前,我们正在通过计划的cron作业或远程执行(通过ssh)来触发作业,因此在业务完成另一个进程之后,我们正在为一些繁重的工作(ETL)设置一个服务器。 在本周早些时候,我们遇到了一个问题,那就是在系统上并行运行着太多的工作,因为他们为CPU时间而奋斗,所有这些工作都以蜗牛的速度前进。

我一直在寻找一个批处理调度器,一个系统,我们可以插入作业到运行队列,系统将逐个处理它们。 任何人都可以build议一个程序/系统来做到这一点? 由于这个项目的鞋子性质,低成本/自由/开源软件将被赞赏。

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

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

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

实际上还有更多的事情,你可以有一些需求来实现一个优先级队列,这个队列可能会带来一些问题,比如饥饿的工作或者类似的问题,但是让事情变得快速起来并不是那么糟糕。

如果像womble所build议的LDP,我会采取的。 拥有这样一个由更大的社区维护的系统当然比创build自己的问题已经解决的问题更好:)

排队服务还具有将资源从实际数字处理中解耦的优点。 通过在某些networking连接上提供作业,您可以简单地将硬件放在(可能的)缩放问题上,并具有几乎无限的可伸缩性。

想到两个解决scheme:

  1. 使用xargs -P控制最大并行进程。
  2. 创build一个Makefile并用make -j产生。

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

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

解决您的问题的重量级解决scheme是使用Sun Grid Engine等 。

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

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

您可以查看一些用于在群集上调度作业的批处理系统,这些系统可以select监视资源使用情况并声明系统过载,以便向其分派更多的工作负载。 你也可以很容易的将它们configuration成一次只能运行一个工作,但是为了使你的工作比一个完整的批处理调度器简单一些(本着保持简单的精神),可能会更好。

至于免费的批处理/调度系统,想到的两个是OpenPBS / Torque和SGE。

编辑补充说:如果你打算在未来增加更多的处理能力,像Torque / OpenPBS / SGE这样的批处理/调度系统可能是不错的select,因为它们基本上是为了pipe理计算资源并将工作量分配给他们。

你总是可以使用lpd – 是的,旧的,但它是一个伪装成打印服务器的广义的批处理控制系统。

man batch

当系统负载水平允许时批处理执行命令; 换句话说,当平均载荷下降到低于1.5,或在调用atd指定的值。

我想这可能是你要找的。 这是Debian的一部分。

wava :一个支持内存的调度程序,当系统中有足够的物理内存(RSS)时,允许执行批处理作业(使用最大的物理内存使用承诺提交)。

这个调度器最初是为了在有大量内存的机器上排队大量长时间运行的作业而创build的,并且大部分同时运行,避免了内存分页和交换,以免影响其他运行的服务的性能系统。

对于ETL等,我们使用Control M是因为这个原因(但现在几年)。 当然,它不是免费或开源的,但是在批处理方面它有非常好的灵活性(如果这样的话,那么这种types的执行stream程)

一个由cron调用的shell脚本可以很容易地做到这一点,它逐行处理它。

我将使用Torque,这是FOSS OpenPBS的更新版本。