我使用 gnuparallel
在多个文件上并行运行管道。但是,如果指定最大值,我的代码会执行它应该执行的操作。每个作业使用每个 CPU 的 CPU 数量(在我的例子中为 64)<5%(基于htop
)。此外,任务的数量和时间。 (再次基于htop
)穿过屋顶,最终杀死服务器。如果我在 gnu 中只指定 30 个核心,parallel
它就可以正常运行。有谁知道如何最大化。服务器断电了?
我的命令是一系列不同的工具来修剪基因组读数:
parallel --jobs 64 "echo -e '\n'{} processing 1>&2 ; \
gunzip -c {} | scriptA.sh | scriptB.sh -outfmt fasta \
| java -jar scriptC.jar |bgzip \
> ${output}/tmp/{/.}.filtered.tmp.fa.gz " ::: ${input} 2> ${output}/0log_parallel_stderr.log
答案1
正如 Luciano 在评论中所说,磁盘 I/O 很可能是原因。
获得更多进程的原因是您的管道将启动至少 5 个进程。因此您应该看到至少有 64*5 个进程正在启动。其中一些还可能启动多个线程。
并行磁盘 I/O 非常难以预测(请参见https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/),实际上不可能说并行多少个作业是最佳的,因为它取决于很多因素。
因此,为了优化您的流程,我会调整作业数量,直到获得最大吞吐量。您可以使用 --joblog 来帮助您查看每个作业运行的时间。