Linux 上的批处理

Linux 上的批处理

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

我一直在寻找一个批处理调度程序,一个我们可以将作业插入运行队列然后系统将逐个处理它们的系统。有人能建议一个程序/系统来做这个吗?由于这个项目的资金有限,如果能提供低成本/FOSS 就更好了。

答案1

我会设置某种排队服务。快速 Google 一下“即用型”内容,就会看到以下内容:

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

  • 创建一个包装器,让用户提交作业,
  • 包装器将作业写入套接字/文件/其他任何内容
  • 创建一个消费者,逐个运行作业,等待其完成
  • 然后消费者会通过 cron 定期调用(大约每 5 分钟一次)
    • 当然要创建一些锁定机制,以便每次只能运行 n 个作业(其中 n=>1)
  • 如果没有工作就什么也不做
  • 如果还有更多作业,则抓取下一个并等待其完成

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

如果 LDP 按照沃姆布尔我接受。由更大的社区维护这样的系统当然比为别人已经解决的问题创建自己的错误要好 :)

此外,排队服务还具有将资源与实际数字运算分离开来的优势。通过使作业通过某种网络连接可用,您可以简单地将硬件投入到(可能的)扩展问题中,并获得几乎无限的可扩展性。

答案2

我想到两个解决方案:

  1. 用于xargs -P控制同时的最大并行进程数。
  2. 创建一个 Makefile 并用 生成make -j

它们实际上都总结在了这里SO线程更详细地。

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

答案3

解决你的问题的一个重量级的方法是使用类似太阳网格引擎

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

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

答案4

您始终可以使用 lpd — — 是的,老式的,但它实际上是一种伪装成打印服务器的通用批处理控制系统。

相关内容