Linux文件描述符限制如何工作?

我被告知,我的服务器拒绝接受客户端networking连接在一个特定的端口可能是由于缺乏文件描述符。 我查了这是什么,并在这里阅读: http : //www.netadmintools.com/art295.html

所以我testing了我的系统,我得到了这个:

cat /proc/sys/fs/file-nr 1088 0 331287 

这是什么意思? 我的限制是相当高的,但我有0可用的文件描述符? 为什么? 我如何解决这个我的服务器?

即使在我closures服务器之后,第二列实际上仍然保持为0,甚至在启动之后它甚至保持为0!

你想看看/ proc / sys / fs / file-max

从最近的linux / Documentation / sysctl / fs.txt:

文件最大和文件编号:

内核动态地分配文件句柄,但是现在它不会再释放它们。

file-max中的值表示Linux内核将分配的最大文件句柄数。 当您收到很多有关用完文件句柄的错误消息时,可能需要增加此限制。

历史上,file-nr中的三个值表示分配的文件句柄的数量,已分配但未使用的文件句柄的数量以及文件句柄的最大数量。 Linux 2.6总是报告0作为自由文件句柄的数量 – 这不是一个错误,它只是意味着分配文件句柄的数量与使用的文件句柄的数量完全一致。

试图分配比file-max更多的文件描述符,用printk报告,查找“VFS:达到文件最大限制”。

编辑:底层的错误可能不是系统耗尽全球filedescriptors,但只是你的过程。 这个问题似乎可能是select的最大大小限制 。

它看起来不像你是系统文件desriptor限制。 看到这个答案 。

也许你的服务器进程使用select ,因此被限制为1024个描述符? 如果你切换到另一个机制,例如poll你不会再限制为1024个描述符。

select()fd_set s一起工作

这是来自select.h的POSIX文档:

以下将被定义为一个宏:

FD_SETSIZE

 Maximum number of file descriptors in an fd_set structure. 

尝试在您的系统上查找或输出FD_SETSIZE

如果你发现FD_SETSIZE对你来说太低了,我宁愿试着摆脱select不是试图增加FD_SETSIZE ,这通常比较困难。

在这种情况下你从accept()得到什么错误? 检查errno并相应地报告。

根据手册页,accept()会给出EMFILE或ENFILE,如果每个进程或整个文件描述符的限制已经达到,那么知道哪个(或者是否有别的东西)是有帮助的。

有一个per-process文件描述符限制,通常设置为1024 – 但可以很容易地增加。