我正在本地Linux服务器上测试服务器和客户端在同一台服务器上。在经过大约1024次连接后,在我的代码中,我连接的地方连接被拒绝。起初,我认为这是fd_set_max选择1024的限制,并将服务器更改为轮询而不是选择,我仍然没有超过这个数字。我的ulimit -n设置为2048,我监视服务器上的lsof,它达到了大约1033(不知道这是否是确切的数字)并且失败。任何帮助深表感谢。为什么1024连接后连接被拒绝?
回答
因此,经过多一点研究......它看起来像我的服务器端听有一个队列深度为20我认为多数民众赞成的原因。你们有没有人认为这个问题呢?
问候
也许你已达到打开文件描述符的进程限制。
我不确定我是否正确理解您:您是否在同一个进程中同时拥有服务器端和客户端?然后你将使用两倍的文件描述符。这接近你看到的ulimit。如果情况并非如此,那么问题可能出现在服务器端?也许服务器进程耗尽描述符,不能再接受更多的连接。
的accept man page提到,你应该得到的返回值:
EMFILE
的每个进程限制打开的文件描述符已经达到。ENFILE
系统已达到打开文件总数限制。
你会得到什么样的错误代码?您显然只能将已成功接入的连接添加到选择或民意调查。
我知道你已经知道如何检查的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
状态中有连接吗?
如果连接速度快于服务器呼叫accept()
,挂起的连接队列可能已满。最大队列长度由服务器中的第二个参数设置为listen()
,或者如果设置为较低,则值为sysctl net.core.somaxconn
(通常为128)。
您的限制来自linux用户限制。如果未指定,则linux限制为1024个打开的文件。若要更改永久编辑/etc/security/limits.conf文件并添加
用户软NOFILE 16535 用户很难NOFILE 16535
或控制台尝试
的ulimit -n 16535
问候
我看见你和一个错误的关闭(sock_fd)语句处理程序提出的意见。
你是否明确地关闭你的套接字 - close()或shutdown()。
我猜不是。你实际上有1024+以上的并发活动连接?为了做到这一点,你必须要有pthreads。那是对的吗?
我有相同的症状。即使增加ulimit -n后,我仍然无法处理更多的1024个输入连接...
我的问题是我使用了select,无法处理1024以上的socket-FD。所以当我增加了限制时,改变!!!(我未能在第一次注意到...)
因此,为了帮助有类似问题的人:
如果你想超过1024座,你必须
- 增加您限制开放的FD(-n的ulimit)
- ,你可能不使用select()(使用调查()代替)
- 1. 为什么连接被拒绝?
- 2. 为什么我的连接被拒绝?
- 3. 为什么我得到“java.net.ConnectException:连接被拒绝:连接”?
- 4. 连接被拒绝
- 5. 连接被拒绝
- 6. Selenium WebDriver:连接被拒绝(连接被拒绝)
- 7. java.net.ConnectException:连接被拒绝(连接被拒绝)
- 8. UnknownError:连接被拒绝(连接被拒绝)
- 9. Radoop:java.net.ConnectException:连接被拒绝:连接
- 10. URLConnection类java.net.ConnectException:连接被拒绝:连接
- 11. java.net.ConnectException:连接被拒绝:连接发生
- 12. RMI(java.net.ConnectException:连接被拒绝:连接)
- 13. 连接错误 - 连接被拒绝
- 14. com.jcraft.jsch.JSchException:java.net.ConnectException:连接被拒绝:连接
- 15. 连接被拒绝:连接错误
- 16. Mongodb连接失败(连接被拒绝)
- 17. 为什么第二次拒绝连接?
- 18. 为什么mongodb拒绝ssl连接?
- 19. httphostconnectexception连接被拒绝
- 20. 连接被拒绝Elasticsearch 2.2
- 21. RMI连接被拒绝
- 22. ssh wget连接被拒绝
- 23. 的file_get_contents:连接被拒绝
- 24. logspout写:连接被拒绝
- 25. Zookeeper -Kafka:ConnectException - 连接被拒绝
- 26. aws ssh连接被拒绝
- 27. SVN连接被拒绝
- 28. geckodriver连接被拒绝
- 29. KafkaProducer连接被拒绝
- 30. Boot-clj连接被拒绝
感谢您的快速反应,让我详细解释一下,所以服务器和客户端在机器中是两个独立的进程。服务器更多的是跟踪所有新客户端进程的管理器。因此,客户端进程向在端口上侦听的服务器注册自己。一旦〜1024个客户端注册,未来的客户端就会拒绝连接。我检查了ulimit -a,并且我将它设置为2048软限制和4096硬限制。 – Gentoo 2009-05-29 01:33:57
@Gentoo你在服务器的接受调用中遇到错误吗?如果是这样的话? – lothar 2009-05-29 01:37:10
@Gentoo不幸的是,您需要知道接受的服务器返回值。也许在服务器上使用strace会对此有所了解。 – lothar 2009-05-29 01:42:44