2009-05-29 79 views
6

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

回答

-1

因此,经过多一点研究......它看起来像我的服务器端听有一个队列深度为20我认为多数民众赞成的原因。你们有没有人认为这个问题呢?

问候

2

也许你已达到打开文件描述符的进程限制。

我不确定我是否正确理解您:您是否在同一个进程中同时拥有服务器端和客户端?然后你将使用两倍的文件描述符。这接近你看到的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 
+0

感谢您的快速反应,让我详细解释一下,所以服务器和客户端在机器中是两个独立的进程。服务器更多的是跟踪所有新客户端进程的管理器。因此,客户端进程向在端口上侦听的服务器注册自己。一旦〜1024个客户端注册,未来的客户端就会拒绝连接。我检查了ulimit -a,并且我将它设置为2048软限制和4096硬限制。 – Gentoo 2009-05-29 01:33:57

+0

@Gentoo你在服务器的接受调用中遇到错误吗?如果是这样的话? – lothar 2009-05-29 01:37:10

+0

@Gentoo不幸的是,您需要知道接受的服务器返回值。也许在服务器上使用strace会对此有所了解。 – lothar 2009-05-29 01:42:44

0

是否有服务器打开了它接受每个连接单独的日志文件中的任何危险吗?

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

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

0

对于大多数琐碎问题的道歉:)
当你说“更改为轮询”时是否重新编译服务器?服务器是否在同一个帐户下运行?它是一个fork-或者可能是一个线程服务器?在客户端致电connect()后,您获得errno == ECONNREFUSED吗?你能否确认你得到RST以回应SYNtcpdump?客户端端口号码是否被重用? TIME_WAIT状态中有连接吗?

3

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

-1

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

用户软NOFILE 16535 用户很难NOFILE 16535

或控制台尝试

的ulimit -n 16535

问候

0

我看见你和一个错误的关闭(sock_fd)语句处理程序提出的意见。

你是否明确地关闭你的套接字 - close()或shutdown()。

我猜不是。你实际上有1024+以上的并发活动连接?为了做到这一点,你必须要有pthreads。那是对的吗?

0

我有相同的症状。即使增加ulimit -n后,我仍然无法处理更多的1024个输入连接...

我的问题是我使用了select,无法处理1024以上的socket-FD。所以当我增加了限制时,改变!!!(我未能在第一次注意到...)

因此,为了帮助有类似问题的人:

如果你想超过1024座,你必须

  • 增加限制开放的FD(-n的ulimit)
  • ,你可能不使用select()(使用调查()代替)