如何编译支持 >1024 文件描述符的 Python?
解决 supervisord 中一个问题的办法是:“编译一个支持超过 1024 个文件描述符的 Python”。
https://github.com/Supervisor/supervisor/issues/26
有人能帮我详细讲讲需要做哪些更改才能实现这个吗?我已经准备好了 Python 2.7.2 的源代码。
我在使用 centos 5.6,如果这有关系的话。
谢谢。
更新:ulimit -n 已经设置为 65535。启动 supervisord 时我遇到的完整错误信息是:
追踪记录(最近的调用在最前面): 文件 "/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 行,在 main go(options) 文件 "/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 行,在 main self.run()
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 112 行,在 run 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, timeout)
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/options.py",第 1113 行,在 select return select.select(r, w, x, timeout) 值错误:文件描述符超出 select() 的范围
1 个回答
这实际上是底层的 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`。