Python — OSError 24 (слишком много открытых файлов) и общая память

Я столкнулся с проблемой, возникло исключение OSError 24 («Слишком много открытых файлов»), поднятое на моем Mac OS X в сценарии Python.

Я понятия не имел, что могло вызвать эту проблему. lsof -p показывал около 40-50 строк, а мой ulimit был 1200 (проверяю с помощью

resource.getrlimit(resource.RLIMIT_NOFILE)

), который вернул кортеж (1200, 1200). Так что я даже близко не превышал лимит.

Что мой скрипт породил ряд подпроцессов, а также выделил сегменты общей памяти. Исключение при выделении сегментов общей памяти. Я использую модуль sysv_ipc.

Также я знал, что общее разрешенное количество сегментов разделяемой памяти достаточно велико (128 сегментов), и команда

ipcs -b -m

дал определенно меньшее количество (не более 40 сегментов).


person Serge    schedule 30.11.2012    source источник


Ответы (1)


Проблема заключалась в системных настройках общей памяти (общая память — вики).

В файле /etc/sysctl.conf есть параметр kern.sysv.shmseg, который представляет максимальное количество сегментов общей памяти, которые может подключить каждый процесс. Так что у меня было значение 32, которого было недостаточно для моего скрипта.

Для просмотра параметров используйте:

sysctl -A | grep shm

Чтобы обновить эти параметры, отредактируйте файл:

sudo vim /etc/sysctl.conf

Мой вид сейчас такой:

kern.sysv.shmmax=564777216
kern.sysv.shmmin=1
kern.sysv.shmmni=700
kern.sysv.shmseg=128
kern.sysv.shmall=131072

Обратите внимание, что вам необходимо перезагрузить систему, чтобы применить настройки.

Чтобы просмотреть выделенные в данный момент сегменты общей памяти, введите:

ipcs -m -b

Чтобы удалить все сегменты общей памяти:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done

Обратите внимание, что действительно будут удалены только те сегменты, которые не привязаны к какому-либо процессу.

Подробнее о настройках общей памяти: http://techjournal.318.com/general-technology/shared-memory-settings-explain/, http://www.spy-hill.com/help/apple/SharedMemory.html, http://support.apple.com/kb/HT4022

person Serge    schedule 30.11.2012