并行有效地运行多个作业

时间:2014-03-06 08:45:06

标签: linux parallel-processing

操作系统:Cent-OS

我要运行一些30,000个作业(或脚本)。每份工作需要3-5分钟。我有48 CPUs(nproc = 48)。我可以并行使用40 CPUs to run 40 Jobs。请建议一些脚本或工具可以通过并行运行每个40个作业来处理30,000个作业。

我做了什么:

  • 我创建了40个不同的文件夹,并通过为每个目录创建一个shell脚本来并行执行这些作业。

  • 我想知道下次处理这类工作的更好方法。

3 个答案:

答案 0 :(得分:4)

正如Mark Setchell所说:GNU Parallel。

find scripts/ -type f | parallel

如果您坚持要保留8个CPU:

find scripts/ -type f | parallel -j-8

但通常只使用nice会更有效率,因为当没有其他人需要时,它会为您提供所有48个核心:

find scripts/ -type f | nice -n 15 parallel

了解更多信息:

答案 1 :(得分:1)

我使用REDIS来做这类事情 - 安装非常简单,CLI易于使用。

我主要使用LPUSH将所有作业推送到REDIS中的“队列”和BLPOP以阻止从队列中删除作业。因此,您可以在开始时LPUSH 30,000个作业(或脚本名称或参数),然后在后台启动40个进程(每个CPU 1个),并且每个进程将在循环中执行BLPOP以获得工作,运行它并做下一步。

您可以添加复杂的图层来记录另一个“队列”中已完成的作业。

这里有一个小小的演示......

首先,在网络中的任何计算机上启动Redis服务器:

./redis-server &    # start REDIS server in background

或者,如果你总是使用它,你可以把它放在你的系统启动中。

现在将3个作业推送到名为jobs的队列:

./redis-cli         # start REDIS command line interface
redis 127.0.0.1:6379> lpush jobs "job1"
(integer) 1
redis 127.0.0.1:6379> lpush jobs "job2"
(integer) 2
redis 127.0.0.1:6379> lpush jobs "job3"
(integer) 3

查看队列中有多少个工作:

redis 127.0.0.1:6379> llen jobs
(integer) 3

等待无限超时作业

redis 127.0.0.1:6379> brpop jobs 0
1) "jobs"
2) "job1"
redis 127.0.0.1:6379> brpop jobs 0
1) "jobs"
2) "job2"
redis 127.0.0.1:6379> brpop jobs 0
1) "jobs"
2) "job3"

由于队列中没有作业,最后一个将等待很长时间:

redis 127.0.0.1:6379> brpop jobs 0

当然,这很容易编写脚本:

将30,000个职位放入队列:

for ((i=0;i<30000;i++)) ; do
    echo "lpush jobs job$i" | redis-cli
done

如果您的Redis服务器位于远程主机上,请使用:

redis-cli -h <HOSTNAME>

以下是检查进度的方法:

echo "llen jobs" | redis-cli
(integer) 30000

你可以开始这样的40个工作:

#!/bin/bash
for ((i=0;i<40;i++)) ; do
    ./Keep1ProcessorBusy  $i &
done

然后Keep1ProcessorBusy会是这样的:

#!/bin/bash

# Endless loop picking up jobs and processing them
while :
do
    job=$(echo brpop jobs 0 | redis_cli)
    # Set processor affinity here too if you want to force it, use $1 parameter we were called with
    do $job
done

当然,您想要运行的实际脚本或作业也可以存储在Redis中。


作为完全不同的选项,您可以查看GNU Parallel,即here。还要记住,您可以使用find选项运行xargs-P的输出以并行化内容。

答案 2 :(得分:0)

只需执行这些脚本,Linux就会在可用的CPU中正确分配这些任务。这是在Linux任务调度程序上。但是,如果您愿意,还可以使用taskset在特定CPU上执行任务(请参阅man taskset)。您可以从脚本执行30K任务。请记住,以这种手动方式,确保你正在做什么。