Ich habe einen Server mit 12 Kernen und möchte ein Skript ausführen, das eine Datei als Eingabeargument verwendet und diese verarbeitet. Ich möchte 8 Kerne und nicht mehr verwenden, um 8 Dateien gleichzeitig auf 8 Kernen parallel zu verarbeiten und dann zum nächsten zu springen, sobald die Verarbeitung für 1 abgeschlossen ist.
Ich habe es folgendermaßen versucht xargs
:
ls /data/paths/ | grep new | xargs -i -P 8 -n 1 bash main.sh {}
Aber wenn ich den Kern sehe, ist die CPU-Auslastung im Snapshot angehängt.
Ich habe es auch mit parallel wie folgt versucht:
ls /data/paths/ | grep new | parallel -j 8 --no-notice bash main.sh {}
Meine Bedingung ist, dass ich es auf 8 CPUs beschränken muss.
BEARBEITEN:
Beim Ausführen ps -ef | grep main.sh
werden 11–12 Prozesse statt 8 angezeigt.
Antwort1
Sie könnentaskset
um die CPU-Affinität eines Prozesses festzulegen. Folgendes stellt sicher, dass Ihr xargs
Befehl nur die ersten 8 virtuellen CPU-Kerne verwendet:
ls /data/paths/ | grep new | taskset -c 0-7 xargs -i -P 8 -n 1 bash main.sh {}
Beachten Sie, dass vonMann-Taskset:
Ein Benutzer muss über CAP_SYS_NICE verfügen, um die CPU-Affinität eines Prozesses zu ändern.