socket.accept 错误 24:打开文件过多

14 投票
3 回答
35353 浏览
提问于 2025-04-15 21:10

我在使用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] 打开文件过多

我不知道为什么会达到文件限制,明明还没有达到。

谢谢大家的帮助!

相关问题:

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

撰写回答