为什么我在1024个连接后拒绝连接?

时间:2009-05-29 01:19:45

标签: c linux sockets

我正在本地Linux服务器上测试服务器和客户端在同一台服务器上。在大约1024个连接之后,在我的代码中,我连接的地方,我得到连接拒绝。起初我以为选择的fd_set_max限制为1024,并且更改了服务器进行轮询而不是选择,我仍然没有超过这个数字。我的ulimit -n设置为2048,我监视服务器上的lsof达到大约1033(不确定这是否是确切的数字)并且失败。非常感谢任何帮助。

8 个答案:

答案 0 :(得分:3)

如果您的连接速度超过服务器调用accept()的速度,则挂起连接的队列可能已满。最大队列长度由服务器中listen()的第二个参数设置,如果较低,则设置为sysctl net.core.somaxconn(通常为128)。

答案 1 :(得分:2)

也许您已达到打开文件描述符的处理限制。

我不确定我是否理解正确:您是否同时拥有服务器端和客户端?然后你将使用两倍的文件描述符。这接近你所看到的ulimit。如果不是这样的话可能是服务器端的问题?也许服务器进程耗尽了描述符,并且不再接受更多的连接。

accept man page提到你应该得到一个返回值:

  

EMFILE
   已达到打开文件描述符的每进程限制。

     

ENFILE
  已达到系统对打开文件总数的限制。

你得到什么错误代码?显然,您只能将成功_accept_ed的连接添加到选择民意调查

我知道您已经知道如何检查 ulimit ,但其他人可能不会:

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 40448
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 40448
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

答案 2 :(得分:0)

服务器是否存在为其接受的每个连接打开单独日志文件的危险?

另一组说服务器有什么上限?

在我看过的一个程序(好几年前)中有一些代码将最大文件大小设置为1 MB。 “遗憾的是,当它第一次添加时,它增加了大小,但随着时间的推移和文件限制的增长意味着后来缩小了它的大小!有没有可能服务器有类似的问题 - 它将打开文件的最大数量设置为像1024这样可笑的高数字?

答案 3 :(得分:0)

为大多数琐碎的问题道歉:)当你说“改为民意调查”时,你重新编译了服务器吗?服务器是否在同一帐户下运行?它是fork - 或者是线程服务器吗?在客户端致电errno == ECONNREFUSED后,您获得connect()吗?您是否可以确认RST响应SYN tcpdump?客户端端口号是否可以重用? TIME_WAIT州是否有连接?

答案 4 :(得分:0)

我在错误处理例程中看到了您使用close(sock_fd)语句所做的注释。

使用后是否明确关闭套接字 - close()或shutdown()。

我猜不会。你实际上有1024多个并发活动连接?为了做到这一点,你必须参与pthreads。这是对的吗?

答案 5 :(得分:0)

我有同样的症状。即使在增加ulimit -n之后,我仍然无法处理1024个以上的连接......

我的问题是我使用了select,它无法处理1024以上的套接字FD。所以当我增加限制时,我的问题实际上已经改变!!!(我最初没注意到......)

所以要帮助有类似问题的人:

如果你想要超过1024个插座,你必须

  • 增加开放FD的限制(ulimit -n)
  • 你可以不使用select ()(改用民意调查())

答案 6 :(得分:-1)

您的限制来自linux用户限制。如果未指定,则linux限制为1024个打开文件。要更改它,请永久编辑/etc/security/limits.conf并添加

用户软件nofile 16535 用户硬nofile 16535

或从控制台尝试

ulimit -n 16535

此致

答案 7 :(得分:-1)

所以,经过一番研究......看起来我的服务器端监听的队列深度为20.我在想这就是原因。你们中的任何人都认为这也是问题吗?

此致