socket.accept 错误 24:打开文件过多
我在使用Ubuntu 9.10运行Python 2.6的服务器时遇到了一个问题。
主要的问题是,我不知道为什么会这样。
我设置了:
ulimit -n = 999999
net.core.somaxconn = 999999
fs.file-max = 999999
而且当服务器运行时,lsof显示我大约有12000个打开的文件。
我还在使用epoll。
但是过了一段时间后,它开始出现异常:
文件 "/usr/lib/python2.6/socket.py",第195行,接受时出错:
错误:[Errno 24] 打开文件过多
我不知道为什么会达到文件限制,明明还没有达到。
谢谢大家的帮助!
相关问题:
- 为什么我的Python线程中的socket并不总是正常关闭(即如果我多次运行程序)
- Windows上的python select.select()
- 为什么我的Python socket.shutdown在Windows上有效但在Ubuntu上无效?
- 无法通过套接字'/var/run/mysqld/mysqld.sock'连接本地MySQL服务 (2)
- 将sslsocket的Python代码转换为Ruby
- Python套接字代理示例,调用bind()时总是出错..为什么?
- Python socket 奇怪地挂起 - 有时(客户端与Flash连接) - python 3.2
- Cherrypy无法在WinXP上创建套接字
3 个回答
0
如果你正在使用supervisord来运行你的程序,上面提到的那些设置可能还不够。这是因为supervisord对它所管理的进程有自己的一套打开文件数量的限制配置。
这个配置文件在 /etc/supervisord.conf
[supervisord]
...
minfds=1024;
16
你也可以像下面这样在你的Python代码中实现这个功能
import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))
第二个参数是一个元组 (软限制, 硬限制)。硬限制是软限制的上限。软限制是实际在一个会话或进程中被执行的限制。这让管理员(或者用户)可以设置硬限制,来规定他们希望允许的最大使用量。其他用户和进程可以根据软限制,自行将资源使用量控制得更低,如果他们愿意的话。
31
这是一些用来设置最大连接数的参数。
在文件 /etc/sysctl.conf 中,
你需要添加:
net.core.somaxconn=131072
fs.file-max=131072
然后,
sudo sysctl -p
在文件 /usr/include/linux/limits.h 中,
你需要修改:
NR_OPEN = 65536
在文件 /etc/security/limits.conf 中,
你需要添加:
* soft nofile 65535
* hard nofile 65535