Python os.Gabel OSError : [Errno 12] Cannot allocate memory (Speicher aber nicht das Problem)
Ich habe ähnliches problem zu diesem hier: Python-subprocess.Popen "OSError: [Errno 12] Cannot allocate memory"
Ich habe einen daemon-Prozess, der läuft OK für ein paar Minuten und läuft dann nicht shell-Programme über popen2.Popen3()
. Es spawnt in 20 threads. Speicher scheint nicht das Problem; das ist das einzige Programm auf dem Rechner ausgeführt werden, der hat 2G RAM, und es weniger als 400M. Ich habe die Protokollierung ru_maxrss und dies ist nur 50M (vor und nach OSError ausgelöst wird).
ulimit -a:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15962
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15962
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Hab ich auch schon beobachten free -m
und ls /proc/$pid/fd | wc -l
während Sie laufen, und weder von diesen scheint der Erschöpfung von Ressourcen. Hier ist die typische free -m
beim laufen:
total used free shared buffers cached
Mem: 2003 374 1628 0 46 154
-/+ buffers/cache: 173 1830
Swap: 283 0 283
... und die fd-Zählung ist rund 90-100.
Dem host ist Ubuntu 12.04 (server jeos - minimal vm), Python 2.7.3 und läuft auf einem VMWare-host.
So Frage ich mich: was Tue ich als Nächstes, um zu diagnostizieren, warum das fehlschlägt? Es sind noch ein paar mehr Ressourcen Statistiken, die ich sammeln kann? Muss ich runter auf die Ebene von strace?
- Wie viele Prozesse ist der Benutzer läuft?
- Ist das system so konfiguriert, overcommit oder nicht? Speicher-accounting-berechnen der gleichen Menge an Speicher, die der Elternteil vor der Verzweigung(Klonen) eines Kindes. Wie groß ist Ihre app vor der Gabelung?
- 1 Prozess, 20 threads. Overcommit ist. Ich weiß nicht, wie groß meine app vor der Verzweigung; nicht, dass das, was ru_maxrss sagt Sie? Wenn nicht, wie würde ich das herausfinden?
- Wow, das ist heikel. Vorausgesetzt, Sie können starten anderer Prozesse aus der shell, der Speicher selbst ist eindeutig nicht das Problem. Also, es muss irgendeine andere Begrenzung. Bitte überprüfen Sie mit sehr viel höheren (oder unbegrenzt) Einstellungen für:
max locked memory
es ist seltsam niedrigstack size
bei Ihrem Prozess, ist am Ende des Python-stack und C-Aufruf fehlschlägt, werden alle system-level-Quoten oder Grenzen gibt, die nicht Teil von ulimit... - Versuchen Sie, mit strace um zu sehen, welche system-Aufruf schlägt fehl (wahrscheinlich wird es entweder
fork
oderexec*
, aber es wäre etwas anderes auch). - Versuchen Sie, Ihr Prozess mit
strace -ff
. Dies wird Ihnen sagen, was Systemaufruf fehlschlägt, und kann nützliche Hinweise auf das, was falsch läuft. - Wenn das zugrunde liegende problem ist in der Tat, wie in der verlinkten Frage, dann hinzufügen von swap-Größe vergleichbar RAM ist ein akzeptabler work-around. Dies kann auch verwendet werden, wie ein einfacher test für die Hypothese, die im verlinkten akzeptierte Antwort. Um eine Wiederholung des Problems
Popen == fork + exec
wofork
[potenziell, fast] verdoppelt verwendeten Speicher für einen winzigen Zeitraum der Zeit. Kernel könnte sein, dass Sie das heck aus... - Ich empfehle ein sscce.org
- +1 für
strace
. Wenn Sie accedentally versuchen zu reservieren 2 **64 - 2 der Speicher aufgrund integer-Unterlauf, erhalten SieENOMEM
. - Sie sollten wirklich noch mit os.popen() mehr vor allem, wenn Sie in 2.7+. Siehe docs.python.org/2/library/os.html#file-object-creation und Teilprozess.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hypothese: wenn Ihr VM ist 32-bit, Sie kann ausgeführt werden Adressraum.
Nicht Speicher: Adressbereich. Lassen Sie mich erklären: in Linux viele Dinge (IO -, video-Karte, memory-mapped-Dateien) verwenden, bis Adressraum ohne unbedingt verbrauchen entsprechend viel Hauptspeicher.
Hier eine Erklärung Verwandte Themen:
http://us.download.nvidia.com/XFree86/Linux-x86/331.89/README/knownissues.html
(look für "Kernel virtual address space Erschöpfung auf der X86-Plattform" Abschnitt, verwenden Sie
dmesg
um zu testen, ob das ist die situation)ENOMEM
Fehler im Ergebnismmap
können sehr gut in meine situation "nicht genug Adressraum", nicht nur "nicht genug Speicher", obwohl ich nicht sicher bin, wie Sie, um dies zu diagnostizieren, in CPython. Wenn Sie einige große Dateienmmap
ed auf Ihrem system, indem jeder Prozess läuft auf es, gut..Prüfen Sie, ob Sie aus dem Raum laufen auf Ihrer Festplatte, das war das problem in meinem Fall.