Подпроцесс Python. Popen “OSError: [Errno 12] не Может выделить память”

Я получил этот ответ в другом потоке, и он работает отлично.

В /etc/samba/smb.conf добавляют следующее к нижней части эти [global] раздел:

client lanman auth = yes 
client ntlmv2 auth = no
108
задан Community 23 May 2017 в 12:02
поделиться

3 ответа

munmap (0xb7d28000, 4096) = 0
write (2, "OSError", 7) = 7

Я видел небрежный код, который выглядит примерно так:

serrno = errno;
some_Syscall(...)
if (serrno != errno)
/* sound alarm: CATROSTOPHIC ERROR !!! */

Вы должны проверить, не происходит ли это в код Python. Errno действительно только в том случае, если исходящий системный вызов не удалось.

Отредактировано для добавления:

Вы не можете сказать, как долго этот процесс живет. Возможные потребители памяти

  • разветвленные процессы
  • неиспользуемые структуры данных
  • разделяемые библиотеки
  • файлы с отображением памяти
0
ответ дан 24 November 2019 в 03:33
поделиться

своп не может быть отвлекающим маневром, предложенным ранее. Насколько велик рассматриваемый процесс python непосредственно перед ENOMEM ?

В ядре 2.6 / proc / sys / vm / swappiness контролирует, насколько агрессивно ядро ​​будет переключаться на подкачку, и overcommit * файлов, сколько и насколько точно ядро ​​может распределять память, подмигивая и кивая. Как и ваш статус отношений в Facebook, это сложно .

... но своп фактически доступен по запросу (согласно веб-хосту) ...

, но не в соответствии с выводом вашего free (1) , которая показывает отсутствие пространства подкачки, распознанного вашим экземпляром сервера. Ваш веб-хостинг наверняка знает об этой теме гораздо больше, чем я, будет работать нормально без места подкачки вообще до тех пор, пока сумма анонимных память и разделяемая память системы V менее примерно 3/4 объема оперативной памяти. .... Системы с оперативной памятью 4 ГБ или меньше [рекомендуется иметь] минимум 2 ГБ пространства подкачки.

Сравните ваши настройки / proc / sys / vm с простой установкой CentOS 5.3. Добавьте файл подкачки. Убери подкачку и посмотри, живешь ли ты дольше.

8
ответ дан 24 November 2019 в 03:33
поделиться

Я продолжаю подозревать, что у вашего клиента / пользователя загружен какой-то модуль ядра или драйвер, который вмешивается в системный вызов clone () (возможно, какое-то неясное улучшение безопасности, что-то вроде LIDS, но более непонятное?) или каким-то образом заполняет некоторые данные ядра структуры, необходимые для работы fork () / clone () (таблица процессов, страница таблицы, таблицы дескрипторов файлов и т. д.).

Вот соответствующая часть справочной страницы fork (2) :

ERRORS
       EAGAIN fork() cannot allocate sufficient memory to copy the parent's page tables and allocate a task  structure  for  the
              child.

       EAGAIN It  was not possible to create a new process because the caller's RLIMIT_NPROC resource limit was encountered.  To
              exceed this limit, the process must have either the CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.

       ENOMEM fork() failed to allocate the necessary kernel structures because memory is tight.

Я предлагаю пользователю попробовать это после загрузки стандартного ядра и с минимальным набором загруженных модулей и драйверов (минимум необходим для запуска вашего приложения / скрипта). Оттуда, если он работает в этой конфигурации, они могут выполнить бинарный поиск между этой конфигурацией и конфигурацией, в которой обнаружена проблема. Это стандартное решение 101 для устранения неполадок системного администратора.

Соответствующая строка в вашем strace :

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)

... Я знаю, что другие говорили о подкачке и доступности памяти (и я бы рекомендовал вам настроить на по крайней мере, небольшой раздел подкачки, по иронии судьбы, даже если он находится на RAM-диске ... пути кода через ядро ​​Linux, когда в нем есть даже крошечный бит подкачки, использовались гораздо шире, чем те (пути обработки исключений), в которых подкачка отсутствует.

Однако я подозреваю, что это все еще красный сельдь.

Тот факт, что free сообщает о 0 (НУЛЕВОЙ) памяти, используемой кешем и буферами, очень тревожит. Я подозреваю, что вывод free ... и, возможно, проблема с вашим приложением здесь, вызваны каким-то проприетарным модулем ядра, который каким-то образом мешает распределению памяти.

Согласно страницам руководства для fork () / clone () системный вызов fork () должен возвращать EAGAIN, если ваш вызов вызовет нарушение лимита ресурсов (RLIMIT_NPROC) ... однако он не говорит, должен ли EAGAIN возвращаться другими нарушениями RLIMIT *. В любом случае, если ваша цель / хост имеет какие-то странные параметры Vormetric или другие параметры безопасности (или даже если ваш процесс работает под какой-то странной политикой SELinux), это может вызвать сбой -ENOMEM.

Это маловероятно обычная проблема Linux / UNIX. У вас там происходит что-то нестандартное.

5
ответ дан 24 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: