4

Eine meiner Anwendungen läuft ungefähr 100 Arbeiter. Es begann als threading Anwendung, aber Leistung (Latenz) Probleme wurden getroffen. Also habe ich diese Arbeiter in multiprocessing.Process es umgewandelt. Der folgende Benchmark zeigt, dass die Verringerung der Last auf Kosten von mehr Speicherverbrauch (Faktor 6) erreicht wurde.Reduzierung des Speicherbedarfs durch Multiprocessing?

Woher kommt die Speichernutzung genau, wenn Linux Kuh verwendet und die Arbeiter keine Daten teilen?

Wie kann ich den Speicherbedarf reduzieren? (Alternative Frage: Wie kann ich reduzieren die Belastung für threading?)

Benchmarks auf Linux 2.6.26, 4 CPUs 2G RAM: (Beachten Sie, dass die CPU-Auslastung in% einer CPU gegeben wird, so Volllast ist 400% . sind die Zahlen aus der Betrachtung Munin Graphen abgeleitet)

    | threading | multiprocessing 
------------------+-----------+---------------- 
memory usage  | ~0.25GB | ~1.5GB 
context switches | ~1.5e4/s | ~5e2/s 
system cpu usage | ~30%  | ~3% 
total cpu usage | ~100%  | ~50% 
load avg   | ~1.5  | ~0.7 

. Hintergrund: die Anwendungsereignisse aus dem Netzwerk verarbeitet und in einer MySQL-Datenbank einige von ihnen zu speichern.

Antwort

3

Mein Verständnis ist, dass mit dynamischen Sprachen, wie Python, Copy-on-Write nicht so effektiv ist, wie viel mehr Speicher nach Forking geschrieben (und daher kopiert) wird. Während der Python-Interpreter das Programm durchläuft, passiert noch viel mehr als nur der Code. Zum Beispiel Referenzzählung - sehr Objekt wird zu schnell geschrieben, da die Referenzzählung den Referenzzählwert in den Speicher schreiben muss (Auslösen einer Kopie).

In diesem Sinne müssen Sie wahrscheinlich eine hybride Threading/Verarbeitung Ansatz haben. Haben Sie mehrere Prozesse, um mehrere Kerne usw. zu nutzen, aber führen Sie jeweils mehrere Threads aus (so können Sie mit der benötigten Parallelität umgehen). Sie müssen nur ausprobieren, wie viele Threads vs Prozesse Sie ausführen.