Как вы компилируете python с> 1024 дескрипторами файла? - PullRequest
1 голос
/ 07 сентября 2011

Обходной путь для проблемы в супервизоре: "скомпилировать Python, который поддерживает> 1024 файловых дескрипторов"

https://github.com/Supervisor/supervisor/issues/26

Может кто-нибудь подсказать мне, какие изменения необходимы для достижения этой цели? У меня есть источник Python 2.7.2 извлечен и готов к работе.

Запуск Centos 5.6, если это имеет значение.

Спасибо.

Обновление: ulimit -n уже установлен на 65535. Это полная ошибка, которую я получаю при запуске supervisord:

Traceback (последний вызов был последним): Файл "/ usr / local / bin / supervisord", строка 8, в load_entry_point ('supervisor == 3.0a10', 'console_scripts', 'supervisord') () Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py", строка 372, в основном идти (варианты) Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py", строка 382, ​​в файле go d.main ()
Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py", строка 95, в основном self.run ()
Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py", строка 112, в работе self.runforever ()
Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py", строка 230, в runforever r, w, x = self.options.select (r, w, x, время ожидания)
Файл "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/options.py", строка 1113, в select вернуть select.select (r, w, x, timeout) ValueError: файловый дескриптор вне диапазона в select ()

1 Ответ

3 голосов
/ 07 сентября 2011

Это на самом деле предел базового select(2) системного вызова.

со страницы руководства:

An fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET() with a value of fd 
that  is  negative  or  is equal  to  or  larger  than  FD_SETSIZE will result in 
undefined behavior. 

И стандартный FD_SETSIZE - 1024.

/usr/include/linux/posix_types.h:#define __FD_SETSIZE   1024

Так что это не проблема Python. Системные вызовы poll(2) и epoll(2) имеют гораздо больший лимит. То, что вам действительно нужно сделать, использовать объект select.epoll (все еще в модуле select) вместо `select.

...