У меня есть аналогичная проблема с этим: Подпроцесс Python.Popen "OSError: [Errno 12] Невозможно выделить память"
У меня есть процесс daemon, который работает ОК в течение нескольких минут, а затем не запускает программы оболочки через 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
Я также наблюдал за 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?