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 niedrig stack 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 oder exec*, 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 wo fork [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 Sie ENOMEM.
  • 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.

Schreibe einen Kommentar