用于在 L 个脚本上批处理 N 个命令的工具(对于 N≫L)?

用于在 L 个脚本上批处理 N 个命令的工具(对于 N≫L)?

假设我可以访问配备调度程序(例如 LSF、Slurm 等)的高性能 Linux 集群,这将允许我拥有最多中号作业在任意时刻要么正在运行,要么正在挂起,其中最多L < 中号可以同时运行。

现在,假设我想运行尽快独立发出命令。

如果 ≤ 中号,我可以将每个命令作为单独的作业提交给调度程序,然后完成。

但如果 > 中号?或者 ≫ 中号甚至?


 ≫ 中号场景发生极其在我的工作中经常会这样,其实经常希望找到一个工具来方便处理它也不是没有道理的1

绕过调度程序施加的限制的一种非常普遍且直接的方法是拆分独立的命令进入L单独的一次性“批处理”脚本,并将后者提交给调度程序,如下所示L单独的工作2 .

诚然,创建这样的一次性批处理脚本是一件乏味的、有点烦人的苦差事,但是熟练使用 shell 或使用 Python、Perl 等脚本语言的人可以轻松处理它,甚至在家 -推出自己的技巧来实现自动化。

然而,我的问题是,Unix 生态系统中是否存在公开(且免费)可用的工具,即使那些编程技能较少的人也可以使用这些工具来自动执行生成的工作L这样的批处理脚本,作为输入给出一个列表独立指挥?


1实际上,这种情况经常发生,令我惊讶的是调度程序尚未对此提供内置支持。据我所知,至少我最熟悉的调度程序(Slurm 和 LSF)没有任何此类支持。如果我遗漏了什么,请纠正我。

2更一般地,可以将命令进入k批处理脚本,只要k ≤ 中号,但是,根据我的经验,选择k = L是在这些约束下实现最大或接近最大吞吐量的最直接方法。其原因并不难看出,但对此事进行充分讨论需要的时间比我在这里花费的时间要多。

答案1

L=10000
M=100000
N=10000000

jobs=$(wc -l < all_jobs.txt)
jobs_per_jobslot=$(( jobs/L + 1))

cat all_jobs.txt | parallel --pipe -N$jobs_per_jobslot 'cat > jobs_{#}'
# submit jobs_*

花 20 分钟阅读第 1+2 章https://doi.org/10.5281/zenodo.1146014您的命令行会因此而喜欢您。

相关内容