OS:分-OS
我有一些30,000作业(或脚本)要运行。每一份工作需要3-5分钟。我有48 CPUs(nproc = 48)。我可以并行地使用40 CPUs to run 40 Jobs。请建议一些脚本或工具可以通过并行运行每个40个作业来处理30000个作业。
我所做的:
发布于 2014-03-06 10:51:45
正如所说: GNU并行。
find scripts/ -type f | parallel如果您坚持保持8个CPU的免费:
find scripts/ -type f | parallel -j-8但是通常使用nice更有效,因为当没有其他人需要时,这将为您提供所有48个核心:
find scripts/ -type f | nice -n 15 parallel要了解更多:
发布于 2014-03-06 09:24:09
我使用过REDIS来做这类事情--安装起来非常简单,而且CLI很容易使用。
我主要使用LPUSH将所有作业推入REDIS中的“队列”,并使用BLPOP对队列中的作业进行阻塞删除。因此,您将在开始时LPUSH 30,000个作业(或脚本名称或参数),然后在后台启动40个进程(每个CPU 1个),每个进程将处于一个执行BLPOP的循环中,以获得一个作业,运行它并执行下一个任务。
您可以添加复杂层,以便在另一个“队列”中记录已完成的作业。
这里有一个关于该做什么的小示范..。
首先,在网络中的任何机器上启动Redis服务器:
./redis-server & # start REDIS server in background或者,你可以把它放在你的系统启动,如果你总是使用它。
现在,将3个作业推送到名为作业的队列中:
./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当然,这是很容易编写的:
将3万份工作排在队列中:
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或者更简单地说,也许:
redis-cli llen jobs
(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,即这里。还请记住,您可以使用find选项通过xargs运行xargs的输出来并行化。
发布于 2014-03-06 08:58:33
只要执行这些脚本,Linux就会在可用的CPU之间适当地分配这些任务。这在Linux任务调度程序上。但是,如果需要,也可以使用taskset在特定的CPU上执行任务(参见man taskset)。您可以通过脚本执行30K任务。用这种手动的方式记住,确定你在做什么。
https://stackoverflow.com/questions/22219262
复制相似问题