我被告知我的服务器拒绝接受特定端口的客户端网络连接可能是由于缺少文件描述符。我查了解这是什么,并在这里阅读:http://www.netadmintools.com/art295.html
所以我测试了我的系统,我得到了这个:
cat /proc/sys/fs/file-nr
1088 0 331287
这是什么意思?我的限制很高但我有0个可用的文件描述符?为什么?我如何为我的服务器解决这个问题?
即使我关闭了我的服务器,第二列实际上仍然保持在0,甚至在启动后它甚至保持在0!
答案 0 :(得分:11)
您想要查看/ proc / sys / fs / file-max而不是
来自最近的linux / Documentation / sysctl / fs.txt:
file-max&文件-NR:
内核动态分配文件句柄,但它还没有 不会再释放他们。
file-max中的值表示文件的最大数量 - 处理Linux内核将分配的内容。当你得到很多 有关用完文件句柄的错误消息,您可能会这样做 想增加这个限制。
历史上,file-nr中的三个值表示数字 已分配的文件句柄,已分配但未使用的文件数 句柄和最大文件句柄数。 Linux 2.6总是如此 报告0作为空闲文件句柄的数量 - 这不是一个 错误,它只是意味着分配的文件句柄数 与已使用的文件句柄数完全匹配。
尝试分配比file-max更多的文件描述符 用printk报告,查找“VFS:file-max limit 达到”。
编辑:基础错误可能不是系统耗尽全局文件描述符,而只是你的进程。似乎问题可能是maximum size limit of select。
答案 1 :(得分:5)
看起来你没有达到系统文件desriptor限制。 See this answer
也许您的服务器进程使用select
,因此仅限于1024个描述符?如果你切换到另一种机制,例如poll
您将不再受限于1024个描述符。
select()
适用于fd_set
s
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
,这通常会更难。
答案 2 :(得分:0)
在这种情况下,您从accept()获得了什么错误?检查错误并相应地报告。
根据手册页,如果已达到每个进程或整个文件描述符限制,accept()将给出EMFILE或ENFILE,知道哪个(或者是否还有其他内容)将会有所帮助。
每个进程的文件描述符限制通常设置为1024 - 但可以很容易地增加。