2016-02-26 2 views
9

Ich experimentierte mit den Variablen MALLOC_MMAP_THRESHOLD_ und MALLOC_MMAP_MAX_ env, um die Speicherverwaltung in einem langen Python 2-Prozess zu beeinflussen. Siehe http://man7.org/linux/man-pages/man3/mallopt.3.htmlReduzieren Sie die Speicherfragmentierung mit MALLOC_MMAP_THRESHOLD_ und MALLOC_MMAP_MAX_

ich die Idee von diesem Bug-Report bekam: http://bugs.python.org/issue11849

Die Ergebnisse habe ich sind ermutigend: Speicherfragmentierung reduziert wird und die typische Hochwassermarke sichtbar im Speicher durch lang laufende Prozesse verwendet wird, ist niedriger .

Meine einzige Sorge ist, wenn es andere Nebenwirkungen gibt, die zurückbeißen können, wenn solche niedrigen Niveau zwickt. Hat jemand Erfahrung in der Verwendung von ihnen? Hier

ist ein Beispiel-Skript, das zeigt, wie diese Variablen RSS-Speicher in einem Skript beeinflussen, die ein großes Wörterbuch erzeugen: https://gist.github.com/lbolla/8e2640133032b0a6bb9c einfach laufen „alloc.sh“ und die Ausgabe vergleichen. Hier ist die Ausgabe für mich:

MALLOC_MMAP_THRESHOLD_=None MALLOC_MMAP_MAX_=None 
N=9 RSS=120968 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=None 
N=9 RSS=157008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=None 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=None 
N=9 RSS=98528 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=0 
N=9 RSS=121012 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=0 
N=9 RSS=121000 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=157004 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98528 

Wie Sie sehen können, verwendet RSS etwa 20% weniger als Vanille Python für dieses Beispiel.

+0

Eine Möglichkeit, dies zu umgehen, ist die Arbeit in einem gegabelten Prozess, der dann beendet wird. – o9000

+0

@ o9000 Ich kann das nicht machen, weil der fragliche Prozess lange läuft. Es ist ein Server, der lange Zeit dort sein soll. – lbolla

+0

@Ibolla Sie können dies sogar in Server Fällen tun. Fork vom Serverprozess, Arbeitsspeicherzuweisungsoperation ausführen, Rückkehr vom gegabelten Prozess zum Serverprozess, Beendigung des gegabelten Prozesses, Rückgabe des Ergebnisses an den Client, der sie angefordert hat. Das bedeutet nicht immer, dass Sie das Problem gelöst haben. Vielleicht sind die Eingabe und Ausgabe so groß, dass sie auf dem Server sowieso riesige Speicherzuweisungen erfordern. YMMV aber du kannst es tun. – marr75

Antwort

3

In Produktion mit diesem Tweak jetzt für eine lange Zeit, ohne Probleme. Also, ich denke, es ist in einigen Fällen eine praktikable Option, um die Speichernutzung in Python-Langzeitprozessen zu verbessern.