korrekte parallele Verwendung von xargs

9

Ich xargsrufe ein Python-Skript auf, um ungefähr 30 Millionen kleine Dateien zu verarbeiten. Ich hoffe, xargsden Prozess parallelisieren zu können. Der Befehl, den ich benutze, ist:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

Grundsätzlich Convert.pywird in einem kleinen lesen json - Datei (4kb), einige Verarbeitung und Schreiben auf eine andere 4kb Datei. Ich laufe auf einem Server mit 40 CPU-Kernen. Auf diesem Server wird kein anderer CPU-intensiver Prozess ausgeführt.

Durch die Überwachung von htop (gibt es übrigens eine andere gute Möglichkeit, die CPU-Leistung zu überwachen?) Finde ich, dass dies -P 40nicht so schnell ist wie erwartet. Manchmal frieren alle Kerne ein und fallen 3-4 Sekunden lang fast auf Null ab, dann erholen sie sich auf 60-70%. Dann versuche ich, die Anzahl der parallelen Prozesse zu verringern -P 20-30, aber es ist immer noch nicht sehr schnell. Das ideale Verhalten sollte eine lineare Beschleunigung sein. Irgendwelche Vorschläge für die parallele Verwendung von xargs?

Yan Zhu
quelle
6
Sie sind höchstwahrscheinlich von E / A betroffen: Das System kann die Dateien nicht schnell genug lesen. Versuchen Sie, mehr als 40 zu starten: Auf diese Weise ist es in Ordnung, wenn einige Prozesse auf E / A warten müssen.
Ole Tange
Welche Art von Verarbeitung macht das Skript? Irgendeine Datenbank / Netzwerk / io beteiligt? Wie lange läuft es?
Fox
1
Ich zweite @OleTange. Dies ist das erwartete Verhalten, wenn Sie so viele Prozesse ausführen, wie Sie über Kerne verfügen und Ihre Aufgaben an E / A gebunden sind. Zuerst warten die Kerne auf IO auf ihre Aufgabe (Schlaf), dann werden sie verarbeitet und dann wiederholt. Wenn Sie weitere Prozesse hinzufügen, haben die zusätzlichen Prozesse, die derzeit nicht auf einem physischen Kern ausgeführt werden, parallele E / A-Vorgänge ausgelöst, die nach Abschluss die Ruhezeiten auf Ihren Kernen eliminieren oder zumindest verkürzen.
PSkocik
1- Haben Sie Hyperthreading aktiviert? 2- In dem, was Sie dort oben haben, wird log.txt tatsächlich bei jedem Aufruf von convert.py überschrieben ... nicht sicher, ob dies das beabsichtigte Verhalten ist oder nicht.
Bichoy
xargs -Pund >öffnet sich für Rennbedingungen aufgrund des Halblinienproblems gnu.org/software/parallel/… Die Verwendung von GNU Parallel wird dieses Problem nicht haben.
Ole Tange

Antworten:

4

Ich würde wetten, dass Ihr Problem Python ist . Sie haben nicht angegeben, welche Art von Verarbeitung für jede Datei ausgeführt wird, aber vorausgesetzt, Sie verarbeiten nur die Daten im Speicher, wird die Laufzeit durch das Starten von 30 Millionen virtuellen Python-Maschinen (Interpreten) dominiert.

Wenn Sie Ihr Python-Programm so umstrukturieren können, dass statt nur einer eine Liste von Dateien erstellt wird, wird die Leistung erheblich verbessert. Sie können dann weiterhin xargs verwenden, um die Leistung weiter zu verbessern. Zum Beispiel 40 Prozesse, von denen jeder 1000 Dateien verarbeitet:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

Das soll nicht heißen, dass Python eine schlechte / langsame Sprache ist; Es ist einfach nicht für die Startzeit optimiert. Sie sehen dies bei jeder auf virtuellen Maschinen basierenden oder interpretierten Sprache. Java wäre zum Beispiel noch schlimmer. Wenn Ihr Programm in C geschrieben wäre, würde es immer noch kosten, einen separaten Betriebssystemprozess zu starten, um jede Datei zu verarbeiten, aber es wäre viel weniger.

Von dort aus können Sie herumspielen, um -Pzu sehen, ob Sie etwas mehr Geschwindigkeit herausholen können, indem Sie möglicherweise die Anzahl der Prozesse erhöhen, um die Vorteile von Prozessoren im Leerlauf zu nutzen, während Daten gelesen / geschrieben werden.

James Scriven
quelle
1

Betrachten Sie also zunächst die Einschränkungen:

Was ist die Einschränkung für jeden Job? Wenn es sich um E / A handelt, können Sie wahrscheinlich mit mehreren Jobs pro CPU-Kern davonkommen, bis Sie das E / A-Limit erreicht haben. Wenn es jedoch CPU-intensiv ist, ist es schlimmer, als sinnlos mehr Jobs gleichzeitig auszuführen, als Sie über CPU-Kerne verfügen.

Mein Verständnis dieser Dinge ist, dass GNU Parallel Ihnen eine bessere Kontrolle über die Warteschlange von Jobs usw. geben würde.

Siehe GNU parallel vs & (ich meine Hintergrund) vs xargs -P für eine detailliertere Erklärung, wie sich die beiden unterscheiden.

Stephen
quelle
0

Überprüfen Sie, wie andere sagten, ob Sie I / O-gebunden sind. Auch xargs' man - Seite schlägt mit -nmit -P, Sie erwähnen nicht die Anzahl der Convert.pyProzesse , die Sie parallel sehen zu laufen.

Wenn Sie an E / A gebunden sind, können Sie versuchen, ein SSD-Blockgerät zu verwenden oder die Verarbeitung in einem tmpfs durchzuführen (in diesem Fall sollten Sie natürlich nach genügend Speicher suchen, um einen Austausch aufgrund von tmpfs zu vermeiden Druck (glaube ich) und der Aufwand, die Daten überhaupt erst zu kopieren).

spuk
quelle