操作系统:Cent-OS
我要运行一些30,000
个作业(或脚本)。每份工作需要3-5分钟。我有48 CPUs(nproc = 48)
。我可以并行使用40 CPUs to run 40 Jobs
。请建议一些脚本或工具可以通过并行运行每个40个作业来处理30,000个作业。
我做了什么:
我创建了40个不同的文件夹,并通过为每个目录创建一个shell脚本来并行执行这些作业。
我想知道下次处理这类工作的更好方法。
答案 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任务。请记住,以这种手动方式,确保你正在做什么。