Gibt es Richtlinien, die bei der Auswahl der Anzahl der Prozesse mit Multiprocessing zu beachten sind?

8

Ich habe gerade meine Füße nass mit Multiprocessing (und es ist total toll!), aber ich frage mich, ob es irgendwelche Richtlinien zur Auswahl der Anzahl der Prozesse gab? Basiert es nur auf der Anzahl der Kerne auf dem Server? Basiert es irgendwie auf der Anwendung, die Sie ausführen (Anzahl der Schleifen, wieviel CPUs usw.)? etc ... wie kann ich entscheiden, wie viele Prozesse zu spawnen? Im Moment bin ich nur raten und hinzufügen / entfernen Prozesse, aber es wäre toll, wenn es eine Art von Leitlinie oder Best Practice wäre.

Noch eine Frage, ich weiß, was passiert, wenn ich zu wenig hinzufüge (Programm ist slooow), aber was, wenn ich "zu viele" hinzufüge?

Danke!

    
Lostsoul 20.02.2012, 02:26
quelle

2 Antworten

9

Wenn alle Threads / Prozesse tatsächlich an die CPU gebunden sind, sollten Sie so viele Prozesse ausführen, wie die CPU Kerne meldet. Aufgrund von HyperThreading können alle physischen CPU-Kerne mehrere virtuelle Kerne darstellen. Rufen Sie multiprocessing.cpu_count auf, um die Anzahl der virtuellen Kerne zu erhalten.

Wenn nur p von einem Ihrer Threads an die CPU gebunden ist, können Sie diese Zahl anpassen, indem Sie sie mit p multiplizieren. Wenn zum Beispiel die Hälfte Ihrer Prozesse CPU-gebunden ist ( p = 0,5) und Sie zwei CPUs mit jeweils vier Kernen und 2x HyperThreading haben, sollten Sie 0,5 * 2 * 4 * 2 = 8 Prozesse starten.

Wenn Sie zu wenige Prozesse haben, wird Ihre Anwendung langsamer als erwartet ausgeführt. Wenn Ihre Anwendung perfekt skaliert und nur CPU-gebunden ist (d. H. 10-mal schneller ist, wenn sie auf der 10-fachen Anzahl von Kernen ausgeführt wird), bedeutet dies, dass die Geschwindigkeit in Relation langsamer ist. Wenn Ihr System beispielsweise 8 Prozesse aufruft, Sie aber nur 4 initiieren, verwenden Sie nur die Hälfte der Verarbeitungskapazität und nehmen doppelt so viel Zeit in Anspruch. Beachten Sie, dass in der Praxis keine Anwendung perfekt skaliert, aber einige (Raytracing, Videokodierung) sind ziemlich nah.

Wenn Sie zu viele Prozesse haben, erhöht sich der Synchronisationsaufwand. Wenn Ihr Programm wenig bis keinen Synchronisierungsaufwand verursacht, hat das keinen Einfluss auf die Gesamtlaufzeit, aber es kann dazu führen, dass andere Programme langsamer als sie sind, es sei denn, Sie setzen Ihre Prozesse auf eine niedrigere Priorität. Übermäßig viele Prozesse (z. B. 10000) sind theoretisch in Ordnung, wenn Ihr Betriebssystem über einen guten Scheduler verfügt. In der Praxis macht praktisch jede Synchronisation den Overhead unerträglich.

Wenn Sie nicht sicher sind, ob Ihre Anwendung CPU-gebunden und / oder perfekt skaliert ist, beobachten Sie einfach die Systemlast mit unterschiedlichen Thread-Werten. Sie möchten, dass die Systemlast geringfügig unter 100% liegt oder die präzisere Verfügbarkeit die Anzahl der virtuellen Kerne ist .

    
phihag 20.02.2012, 02:47
quelle
1

Es basiert definitiv darauf, was die Anwendung tut. Wenn es CPU-lastig ist, ist die Anzahl der Kerne ein vernünftiger Ausgangspunkt. Wenn es IO-lastig ist, helfen mehrere Prozesse sowieso nicht. Wenn es hauptsächlich CPU mit gelegentlichem IO (z. B. PNG-Optimierung) ist, können Sie einige Prozesse mehr als die Anzahl der Kerne ausführen.

Die einzige Möglichkeit, dies sicher zu wissen, besteht darin, Ihre Anwendung mit realistischen Eingaben auszuführen und die Ressourcennutzung zu überprüfen. Wenn Sie mehr CPU-Zeit benötigen, fügen Sie weitere Arbeitsprozesse hinzu.

    
millimoose 20.02.2012 02:51
quelle