我在本地Linux服务器上testing服务器和客户端在同一台服务器上。 在大约1024个连接之后,在我的代码中,我连接的地方拒绝了连接。 起初我以为这是fd_set_maxselect1024的限制,并改变服务器做轮询而不是select,我仍然不会超过这个数字。 我的ulimit -n设置为2048,我监视服务器上的lsof达到1033(不知道这是否是确切的数字),并失败。 任何帮助深表感谢。
如果连接速度比您的服务器调用accept()
更快,则挂起的连接队列可能已满。 最大队列长度由服务器中listen()
的第二个参数设置,或者设置为sysctl net.core.somaxconn
(通常为128)(如果较低)。
也许你达到了打开文件描述符的进程限制。
我不确定我是否正确理解你:服务器端和客户端在同一个进程中吗? 那么你将使用两倍的文件描述符。 这接近你所看到的ulimit。 如果情况并非如此,那么问题可能出现在服务器端? 也许服务器进程耗尽描述符,不能再接受更多的连接。
接受手册页提到你应该得到一个返回值:
EMFILE
打开文件描述符的每进程限制已经达到。ENFILE
系统已经达到了打开文件总数的限制。
你得到什么错误代码? 您显然只能将已经成功_accept_ed的连接添加到select或poll中 。
我知道你已经知道如何检查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
服务器是否有任何危险为其接受的每个连接打开单独的日志文件?
另一个组织说服务器有什么上限?
在我看过的一个程序(好几年前)中有一些代码将最大文件大小设置为1 MB。 “可惜的是,当它第一次被添加,它增加了规模,但随着时间的推移和文件限制的增长意味着后来它正在缩小规模! 有没有可能,服务器有一个类似的问题 – 它设置打开文件的最大数量为1024像一个可笑的高数字?
道歉大多是微不足道的问题:)
当你说“更改为轮询”时,你是否重新编译了服务器? 服务器是否在同一个帐户下运行? 这是一个fork
或可能是一个线程服务器? 在客户端connect()
后调用errno == ECONNREFUSED
吗? 你可以确认你得到一个RST
响应SYN
与tcpdump
? 客户端端口号码是否被重用? TIME_WAIT
状态下是否有连接?
你的限制是来自linux用户的限制。 如果没有指定,linux的限制是1024个打开的文件。 要永久地修改/etc/security/limits.conf并添加
用户软nofile 16535用户硬nofile 16535
或从控制台尝试
ulimit -n 16535
问候
所以,经过多一点研究..看起来我的服务器端听有一个队列深度为20我正在想这就是原因。 你们有没有想过这个问题呢?
问候
我在错误处理例程中看到了用close(sock_fd)语句所做的注释。
你是否明确地关闭你的套接字 – close()或shutdown()。
我猜不是。 你实际上有1024+以上的并发活动连接? 你将不得不有pthreads为了做到这一点。 那是对的吗?
我有同样的症状。 即使增加了ulimit -n,我仍然无法处理更多的1024个输入连接。
我的问题是,我使用了select,无法处理1024以上的socket-FD。所以当我增加了我的限制,我的问题实际上改变了!!!(我一开始没有注意到…)
所以要帮助有类似问题的人:
如果你想要超过1024个插座,你必须