高效地并行运行多个作业
- 2024-10-25 08:42:00
- admin 原创
- 52
问题描述:
操作系统:Cent-OS
我有一些30,000
作业(或脚本)要运行。每个作业需要 3-5 分钟。我有48 CPUs(nproc = 48)
。我可以40 CPUs to run 40 Jobs
并行使用。请建议一些脚本或工具可以通过并行运行每 40 个作业来处理 30,000 个作业。
我做了什么:
我创建了 40 个不同的文件夹,并通过为每个目录创建一个 shell 脚本来并行执行作业。
我想知道下次处理此类工作的更好方法。
解决方案 1:
正如 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
了解更多信息:
观看介绍视频以获得快速介绍:
https://www.youtube.com/playlist?list =PL284C9FF2488BC6D1浏览教程 (man parallel_tutorial)。命令行会让您爱上它。
解决方案 2:
我曾经REDIS
做过这种事 —— 安装非常简单,而且 CLI 易于使用。
我主要用来LPUSH
将所有作业推送到 REDIS 中的“队列”中,并BLPOP
从队列中阻塞地删除作业。因此,您将LPUSH
在开始时有 30,000 个作业(或脚本名称或参数),然后在后台启动 40 个进程(每个 CPU 一个),每个进程都会处于循环中,以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
或者更简单地说:
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
`-P`
解决方案 3:
只需执行这些脚本,Linux 就会在内部将这些任务在可用 CPU 之间正确分配。这取决于 Linux 任务调度程序。但是,如果您愿意,也可以使用taskset
(请参阅man taskset
)在特定 CPU 上执行任务。您可以通过脚本来执行 30K 任务。请记住,在这种手动方式中,请务必确保您正在执行的操作。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件