限制多次调用之间的 GNU 并行作业总数

限制多次调用之间的 GNU 并行作业总数

我正在使用一台具有 10k 核心的计算机,但一次只允许访问 1,000 个核心。

我有一个脚本可以在多个地方受益于 GNU 并行。并行处理 A 级,并在该脚本内执行 30 倍的操作。

--link重新编写整个脚本以使用并行和语法将需要大量工作::: A B C ::: $(seq 30)

有没有一种方法可以让两个独立的调用parallel能够进行足够的通信,从而将两者之间的作业总数限制为 1000 个?

答案1

如果我理解正确的话,您想要运行 2 个(或更多实例)GNU Parallel,并且您希望正在运行的作业总数小于 1000。

因此,在某个时刻,其中一个可能会运行 300 个作业,而另一个则应限制为 700 个作业。

--limit是为这种特殊情况而设计的:它将运行您选择的脚本,并根据退出值限制作业数量。

所以现在您需要某种方法来确定正在运行的作业总数。

也许某种[ $(ps aux | grep myprogram | wc -l) -gt 1000 ]

(什么怪物有10k核心?)

答案2

另一种解决方案可能是使用--sqlmaster/--sqlworker.

生成 1000 --sqlworkers 并将要运行的作业放入数据库中--sqlmaster

master1$ seq 10000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.1{}
# The + is needed to append to existing table
master2$ seq 4000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.2{}

worker1..1000$ parallel --sqlworker +pg://user:pass@server/db/table 

我认为这比版本不太敏感--limit- 特别是因为你是在集群上运行 - 而不是在一台机器上。

相关内容