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