2010-10-21 141 views
12

有人告诉我,我的服务器拒绝接受特定端口的客户端网络连接,可能是由于缺少文件描述符。我抬头一看,这是怎么一回事,并在这里读到它:http://www.netadmintools.com/art295.htmlLinux文件描述符限制如何工作?

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

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

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

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

+0

请参阅http://serverfault.com/questions/190435/how-to-increase-open-files-limit-for-process-from-1024-to-10240 - – Jayan 2010-10-22 04:24:31

+0

您是否有任何关于您的新结果问题?任何答案都有帮助吗? – 2010-10-31 16:17:04

回答

11

你想查看/ proc/SYS/FS /文件-MAX,而不是

从最近的Linux /文档/ sysctl的/ fs.txt:

文件-MAX &文件-NR:

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

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

历史上,file-nr中的三个值表示 分配的文件句柄的数量,分配但未使用的文件句柄数量 句柄以及文件句柄的最大数量。 Linux 2.6始终为 报告0为空闲文件句柄的数量 - 这不是 错误,它只是表示分配的文件句柄数量 与使用的文件句柄数完全匹配。

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

编辑:底层错误可能不是系统用完全局filedescriptors,但只是你的过程。看来问题可能是maximum size limit of select

5

它看起来并不像系统文件desriptor限制。 See this answer

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

select()作品与fd_set小号

This is from the POSIX documentation of select.h:

下,应定义为宏:

FD_SETSIZE

Maximum number of file descriptors in an fd_set structure. 

试图找到或输出FD_SETSIZE在您的系统上。

如果您发现FD_SETSIZE对您而言太低,我宁愿尝试从select移开,而不是尝试增加FD_SETSIZE,这通常比较困难。

+0

选择受限于1024个描述符?你能进一步解释吗? – erotsppa 2010-10-21 19:55:31

+0

与FD_SETSIZE – unbeli 2010-10-21 20:26:04

+3

@unbeli无关我已经看到在服务器中使用select一次又一次地击中FD_SETSIZE。请解释你认为erotsppa会发生什么。 – 2010-10-21 20:29:16

0

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

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

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