高效地并行运行多个作业

2024-10-25 08:42:00
admin
原创
57
摘要:问题描述:操作系统:Cent-OS我有一些30,000作业(或脚本)要运行。每个作业需要 3-5 分钟。我有48 CPUs(nproc = 48)。我可以40 CPUs to run 40 Jobs并行使用。请建议一些脚本或工具可以通过并行运行每 40 个作业来处理 30,000 个作业。我做了什么:我创建了...

问题描述:

操作系统: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

了解更多信息:

解决方案 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 任务。请记住,在这种手动方式中,请务必确保您正在执行的操作。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   609  
  在现代项目管理中,资源的有效利用是确保项目成功的关键因素之一。随着技术的不断进步,越来越多的工具和软件被开发出来,以帮助项目经理和团队更高效地管理资源。本文将介绍10款工具,这些工具可以帮助项目团队提升资源利用效率,从而实现项目目标。禅道项目管理软件禅道项目管理软件是一款开源的项目管理工具,广泛应用于软件开发和其他行业...
项目管理系统   3  
  在项目管理领域,软件工具的不断升级和创新是推动效率和协作的关键。2024年,众多项目管理软件将迎来一系列令人期待的升级功能,这些新特性不仅将提升团队的工作效率,还将增强用户体验和数据分析能力。本文将详细介绍10款项目管理软件的最新升级功能,帮助项目经理和团队成员更好地规划和执行项目。禅道项目管理软件禅道项目管理软件一直...
开源项目管理工具   2  
  信创国产系统的10个关键厂商及其技术生态随着全球信息技术格局的不断演变,信创(信息技术应用创新)产业作为国产化替代的重要阶段,正逐步成为推动我国信息技术自主可控、安全可靠的核心力量。信创产业不仅关乎国家信息安全,也是数字经济高质量发展的关键支撑。本文将深入探讨信创国产系统中的10个关键厂商及其技术生态,分析它们在信创浪...
项目管理流程   0  
  在探讨项目管理的广阔领域中,成功并非偶然,而是精心策划、高效执行与持续优化的结果。项目管理的成功之道,可以从明确的目标设定与规划、高效的团队协作与沟通、以及灵活的风险管理与适应变化这三个核心方面进行深入解析。每个方面都是项目成功的基石,它们相互交织,共同支撑起项目的顺利推进与最终成就。明确的目标设定与规划项目管理的首要...
建筑工程项目管理规范   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用