1

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 行,在主 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 中。选择(r,w,x,超时)
文件“/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/options.py”,第 1113 行,在选择中return select.select(r, w, x, timeout) ValueError: filedescriptor out of range in select()

4

1 回答 1

3

这实际上是底层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。

于 2011-09-07T05:52:47.567 回答