我遇到了类似的问题:Python subprocess.Popen "OSError: [Errno 12] Cannot allocate memory"
我有一个守护进程,运行良好几分钟后,就无法通过
popen2.Popen3()
运行shell程序。它生成20个线程。内存似乎不是问题;该机器上只有这个程序在运行,具有2G的RAM,并且只使用不到400M的内存。我一直在记录ru_maxrss,这仅为50M(在引发OSError之前和之后)。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
我一直在观察运行时的 free -m
和 ls /proc/$pid/fd | wc -l
,但是它们都没有显示出资源耗尽的情况。下面是运行时典型的 free -m
输出:
total used free shared buffers cached
Mem: 2003 374 1628 0 46 154
-/+ buffers/cache: 173 1830
Swap: 283 0 283
...并且fd计数约为90-100。
主机是Ubuntu 12.04(服务器jeos-最小vm),Python 2.7.3,运行在VMWare主机上。
因此,我想知道:下一步该怎么诊断失败的原因?是否有更多的资源统计信息可以收集?我需要降到strace的级别吗?
strace -ff
命令来运行您的进程。这将告诉您哪个系统调用失败并可能提供有用的提示,帮助您找出问题所在。 - Andrea CorbelliniPopen == fork + exec
,其中fork
在极短的时间内[可能几乎]使使用的内存翻倍。内核可能会告诉你去死... - Dima TisnekENOMEM
。对于strace
,请点赞+1。 - myaut