Python os.fork OSError:[Errno 12]无法分配内存(但内存不是问题)

Ali*_*ley 13 python linux memory out-of-memory

我有类似的问题:Python subprocess.Popen"OSError:[Errno 12]无法分配内存"

我有一个守护程序进程运行好几分钟然后无法通过运行shell程序popen2.Popen3().它产生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
Run Code Online (Sandbox Code Playgroud)

我一直在观看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
Run Code Online (Sandbox Code Playgroud)

...而且fd计数大约是90-100.

主机是在VMWare主机上运行的Ubuntu 12.04(服务器jeos - minimal vm),Python 2.7.3.

所以我想知道:我接下来要做什么来诊断为什么会失败?我可以收集更多的资源统计数据吗?我需要达到strace的水平吗?

mrk*_*afk 2

假设:如果您的虚拟机是 32 位的,您可能会耗尽地址空间。

不是内存:地址空间。让我解释一下:在 Linux 中,许多东西(IO、显卡、内存映射文件)都会占用地址空间,但不一定消耗相应数量的主内存。

以下是相关问题的解释:

http://us.download.nvidia.com/XFree86/Linux-x86/331.89/README/knownissues.html

(查找“X86平台上的内核虚拟地址空间耗尽”部分,用于dmesg测试是否是这种情况)

ENOMEM结果中的错误mmap很可能意味着“地址空间不足”的情况,而不仅仅是“内存不足”,尽管我不确定如何在 CPython 中诊断这一点。mmap如果您的系统上运行的任何进程有一些大文件,那么..