我正在本地Linux服务器上测试服务器和客户端在同一台服务器上。在大约1024个连接之后,在我的代码中,我连接的地方,我得到连接拒绝。起初我以为选择的fd_set_max限制为1024,并且更改了服务器进行轮询而不是选择,我仍然没有超过这个数字。我的ulimit -n设置为2048,我监视服务器上的lsof达到大约1033(不确定这是否是确切的数字)并且失败。非常感谢任何帮助。
答案 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个插座,你必须
答案 6 :(得分:-1)
您的限制来自linux用户限制。如果未指定,则linux限制为1024个打开文件。要更改它,请永久编辑/etc/security/limits.conf并添加
用户软件nofile 16535 用户硬nofile 16535
或从控制台尝试
ulimit -n 16535
此致
答案 7 :(得分:-1)
所以,经过一番研究......看起来我的服务器端监听的队列深度为20.我在想这就是原因。你们中的任何人都认为这也是问题吗?
此致