高效地并行运行多个作业

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 个作业。我做了什么:我创建了...

问题描述:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用