私は gnu を使用してparallel
、複数のファイルでパイプを並列に実行しています。私のコードは期待どおりに動作しますが、CPU の最大数 (私の場合は 64) を指定すると、各ジョブは各 CPU の 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 を使用すると、各ジョブの実行時間を確認できます。