Python os.fork OSError: [Errno 12] Невозможно выделить память (но память не проблема)

У меня есть аналогичная проблема с этим: Подпроцесс 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?

Ответ 1

Гипотеза: если ваша виртуальная машина 32-разрядная, у вас может быть нехватка адресного пространства.

Не память: адресное пространство. Позвольте мне объяснить: в Linux многие вещи (IO, видеокарты, файлы с отображением памяти) используют адресное пространство, не обязательно потребляя соответствующее количество основной памяти.

Вот объяснение связанных вопросов:

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

(найдите "Исключение виртуального адресного пространства ядра на платформе X86", используйте dmesg, чтобы проверить, если ситуация)

ENOMEM Ошибка в результате mmap вполне может означать ситуацию "недостаточно адресного пространства", а не просто "недостаточно памяти", хотя я не уверен, как диагностировать это в CPython. Если у вас есть некоторые большие файлы mmap ed в вашей системе любым процессом, запущенным на нем, хорошо..

Ответ 2

Убедитесь, что на вашем диске не хватает места, что было проблемой в моем случае.

[email protected]:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              16G   16G     0 100% /
tmpfs                 2.0G     0  2.0G   0% /dev/shm
/dev/sdb              296G  162G  119G  58% /home