Epoll面对大量联接时的事件处理
Epoll面对大量连接时的事件处理
最近写了一个epoll服务器,用的ET模式,关注了EPOLLRDHUP/EPOLLHUP/EPOLLERR,所有事件处理也都循环直到EAGAIN等。测试时,客户端循环发起4096个连接,服务器最终连接成功的只能有3000多个,且接受连接不连续,一顿一顿的。后来改成每256个连接sleep1毫秒后,基本可以达到4096了。然后直接关闭客户端窗口,服务器端收到的断开事件也只有3000多个。同样的情况用我写的iocp服务器,则连接断开都正常,且很平滑。请问大家这是什么情况?是否有什么疏漏?
------解决方案--------------------
路过,学习,顶。
------解决方案--------------------
客户端向服务器发起连接,发送SYN,服务器回SYN+ACK,客户端收到后为ESTABLISHED状态,并向服务器发ACK。但ESTABLISHED不一定真的ESTABLISHED,会出现这种情况:client为ESTABLISHED状态而server为SYN_RECV状态。这是因为如果并发连接太多,服务器accept处理不过来,完成连接队列已满,收到客户端ACK后,无法正常建立连接。之后会向client发送多次的SYN+ACK,发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中,默认为5。在发送5次之后还是无法建立连接,服务器就不会再重发,并将该半连接从半连接队列删除和释放。此时客户端依然是ESTABLISHED状态。如果此后客户端向服务器发送数据,服务器由于找不到对应连接而将数据包丢弃,客户端得不到ACK而会不断重发,服务器最终会向其发RST,导致client的这种半连接最后也会结束。
最近写了一个epoll服务器,用的ET模式,关注了EPOLLRDHUP/EPOLLHUP/EPOLLERR,所有事件处理也都循环直到EAGAIN等。测试时,客户端循环发起4096个连接,服务器最终连接成功的只能有3000多个,且接受连接不连续,一顿一顿的。后来改成每256个连接sleep1毫秒后,基本可以达到4096了。然后直接关闭客户端窗口,服务器端收到的断开事件也只有3000多个。同样的情况用我写的iocp服务器,则连接断开都正常,且很平滑。请问大家这是什么情况?是否有什么疏漏?
------解决方案--------------------
路过,学习,顶。
------解决方案--------------------
客户端向服务器发起连接,发送SYN,服务器回SYN+ACK,客户端收到后为ESTABLISHED状态,并向服务器发ACK。但ESTABLISHED不一定真的ESTABLISHED,会出现这种情况:client为ESTABLISHED状态而server为SYN_RECV状态。这是因为如果并发连接太多,服务器accept处理不过来,完成连接队列已满,收到客户端ACK后,无法正常建立连接。之后会向client发送多次的SYN+ACK,发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中,默认为5。在发送5次之后还是无法建立连接,服务器就不会再重发,并将该半连接从半连接队列删除和释放。此时客户端依然是ESTABLISHED状态。如果此后客户端向服务器发送数据,服务器由于找不到对应连接而将数据包丢弃,客户端得不到ACK而会不断重发,服务器最终会向其发RST,导致client的这种半连接最后也会结束。