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 сегментов).
1 ответ
Проблема была в настройках системы с общей памятью ( shared memory - wiki).
Есть параметр kern.sysv.shmseg
в /etc/sysctl.conf
файл, представляющий максимальное количество сегментов разделяемой памяти, которое может прикрепить каждый процесс. Таким образом, у меня было значение 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