提升TimeoutError:[Errno 110] sockt.send_all(请求)时连接超时

问题描述 投票:0回答:1

客户端插座设置:

 s = socket.create_connection(self._addr, timeout=15)
 s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
 s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
 s.settimeout(300)

服务器插座设置:

 sock = socket.socket(family=socket.AF_INET)
 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 sock.setblocking(False)
 sock.bind(addr)
 sock.listen(512)

每台客户机约有300个客户端(8核CPU)。每个服务器工作者服务约300个客户端。要求的身体很小,可能是2KB。 somtetimes客户端将引发超时错误,而s.send_all(请求)远远少于300s,特别是当客户端密集请求时。

我不知道问题出在哪里?在客户端或服务器端?

sockets concurrency timeout
1个回答
0
投票

Finanly我发现原因不是并发性。它是由LB和keep-alive选项引起的。 当服务器发送FIN时,LB将在2分钟后删除连接信息,无论客户端是否发送FIN。 客户端没有向服务器发送FIN,并且在tcpkeepalivetime之后,客户端将开始发送detecor消息,但LB不会识别,因为连接信息已被删除。所以客户端将重试tcpkeepaliveprobes次,然后发送RST。 在此之后,如果客户端发送somothing,则会引发TimeoutError。 在我的应用程序中,服务器不会主动发送消息。 我对这种情况的解决方案是:在客户端发送之前,检查套接字是否可读,如果套接字是可读的,则连接不正常,需要关闭套接字并重新连接服务器。

(原谅我可怜的英语,我希望这可能对某人有所帮助)

© www.soinside.com 2019 - 2024. All rights reserved.