Я получил этот ответ в другом потоке, и он работает отлично.
В /etc/samba/smb.conf
добавляют следующее к нижней части эти [global]
раздел:
client lanman auth = yes
client ntlmv2 auth = no
munmap (0xb7d28000, 4096) = 0
write (2, "OSError", 7) = 7
Я видел небрежный код, который выглядит примерно так:
serrno = errno;
some_Syscall(...)
if (serrno != errno)
/* sound alarm: CATROSTOPHIC ERROR !!! */
Вы должны проверить, не происходит ли это в код Python. Errno действительно только в том случае, если исходящий системный вызов не удалось.
Отредактировано для добавления:
Вы не можете сказать, как долго этот процесс живет. Возможные потребители памяти
своп не может быть отвлекающим маневром, предложенным ранее. Насколько велик рассматриваемый процесс python непосредственно перед ENOMEM
?
В ядре 2.6 / proc / sys / vm / swappiness
контролирует, насколько агрессивно ядро будет переключаться на подкачку, и overcommit *
файлов, сколько и насколько точно ядро может распределять память, подмигивая и кивая. Как и ваш статус отношений в Facebook, это сложно .
... но своп фактически доступен по запросу (согласно веб-хосту) ...
, но не в соответствии с выводом вашего free (1)
, которая показывает отсутствие пространства подкачки, распознанного вашим экземпляром сервера. Ваш веб-хостинг наверняка знает об этой теме гораздо больше, чем я,
будет работать нормально без места подкачки
вообще до тех пор, пока сумма анонимных
память и разделяемая память системы V
менее примерно 3/4 объема оперативной памяти.
.... Системы с оперативной памятью 4 ГБ или меньше
[рекомендуется иметь] минимум
2 ГБ пространства подкачки.
Сравните ваши настройки / proc / sys / vm
с простой установкой CentOS 5.3. Добавьте файл подкачки. Убери подкачку
и посмотри, живешь ли ты дольше.
Я продолжаю подозревать, что у вашего клиента / пользователя загружен какой-то модуль ядра или драйвер, который
вмешивается в системный вызов 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. У вас там происходит что-то нестандартное.