Ich verwende gnu, parallel
um eine Pipe für mehrere Dateien parallel auszuführen. Mein Code tut, was er soll, aber wenn ich die maximale Anzahl an CPUs spezifiziere (in meinem Fall 64), verwendet jeder Job <5 % von jeder CPU (basierend auf htop
). Außerdem htop
gehen die Anzahl der Aufgaben und die Anzahl (wiederum basierend auf ) durch die Decke, was den Server schließlich zum Absturz bringt. Wenn ich in gnu nur 30 Kerne spezifiziere, parallel
läuft es einwandfrei. Weiß jemand, wie man die Leistung des Servers maximieren kann?
Mein Befehl ist eine Pipe mit verschiedenen Tools zum Trimmen genomischer Lesevorgänge:
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
Antwort1
Wie Luciano im Kommentar sagt, ist die Ursache höchstwahrscheinlich der Festplatten-E/A.
Der Grund für die zusätzlichen Prozesse ist, dass Ihre Pipeline mindestens 5 Prozesse startet. Sie sollten also mindestens 64*5 gestartete Prozesse sehen. Einige davon können auch mehrere Threads starten.
Parallele Festplatten-E/A sind sehr unvorhersehbar (siehehttps://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/), und es ist in der Praxis unmöglich zu sagen, wie viele parallele Jobs optimal sind, weil dies von so vielen Faktoren abhängt.
Um Ihren Flow zu optimieren, würde ich die Anzahl der Jobs anpassen, bis Sie den höchsten Durchsatz erzielen. Sie können --joblog verwenden, um zu sehen, wie lange jeder Job läuft.