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

12

在运行Python2.6服务器时,我遇到了Ubuntu 9.10中打开文件的问题。

主要问题是,我不知道为什么会出现这种情况。

我已经进行了以下设置:

ulimit -n = 999999

net.core.somaxconn = 999999

fs.file-max = 999999

而且当服务器在运行时,lsof命令显示有大约12000个打开的文件。

另外,我正在使用epoll。

但是过一段时间后,它开始抛出异常:

File "/usr/lib/python2.6/socket.py", line 195, in accept error: [Errno 24] Too many open files

而我不知道它如何达到文件限制,因为它还没有达到限制。

谢谢帮助)


“ulimit -n” 返回什么?系统能否真正让你将其设置为999999? - Daniel Stutzbach
1
你可能已经达到了每个进程的文件描述符限制,而且你没有注意到你如何修改它。请参考/usr/include/linux/limits.h NR_OPEN。你打开了12k个文件,你该怎么办? - msw
关于"/usr/include/linux/limits.h NR_OPEN",我不知道它被设置为1024,已更改为65536。 关于"ulimit -n",它返回999999。现在将使用这个新的NR_OPEN选项测试服务器。并会回复)谢谢) - Andrey Nikishaev
我测试了该服务器的新选项,它完美地工作了))非常感谢您的帮助))) - Andrey Nikishaev
嗯...发现系统有一些奇怪的行为。 我将所有限制都设置为999999并启动了服务器。我添加了一些功能,它会使用"sysctl fs.file-nr"和"lsof | wc -l"将系统中打开文件的数量写入日志,当服务器负载高时,它会出现错误24:打开的文件太多。但是打开的文件数不超过15k。也许还有其他限制?或者其中一些没有正确设置(如果是这样,如何检查?) - Andrey Nikishaev
3个回答

30

配置最大开放连接的参数。

位置位于/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

这个限制的作用是什么?是防止恶意用户...? - meawoppl
这限制了每个用户打开描述符的数量。因此,例如,如果您的数据库使用了所有描述符,则您的Web服务器仍将正常工作。 - Andrey Nikishaev

15
你可以像以下示例一样从你的Python代码中完成这个操作。
import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))

第二个参数是元组(soft_limit, hard_limit)。硬限制是软限制的上限。软限制是对会话或进程实际执行的限制。这允许管理员(或用户)将硬限制设置为他们希望允许的最大使用量。其他用户和进程可以使用软限制将其资源使用限制到更低的水平,如果他们愿意的话。


这个更新有助于解释函数,但我的问题是它是否会做出永久性的更改,或者如果我重新启动Python解释器,它是否会重置限制。 - Michael
@Michael 这个更改是一个进程范围的。每次运行脚本时,您需要设置限制。 - Maksym Polshcha

-1
如果您正在使用supervisord运行进程,则上述提到的所有内容可能不足够。这是因为supervisord针对其进程打开文件的限制具有自己的配置。
在/etc/supervisord.conf中。
[supervisord]
...
minfds=1024;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接