Raise TimeoutError: [Errno 110] Время ожидания соединения при sockt.send_all (запрос) - PullRequest
0 голосов
/ 22 февраля 2019

настройки сокета клиента:

 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-ядерный ЦП).около 300 клиентов на каждого обслуживающего работника сервера.Требуемое тело маленькое, может быть, 2 КБ.Иногда клиент выдаст ошибку тайм-аута, в то время как s.send_all (запрос) намного меньше, чем 300 с, особенно когда клиенты интенсивно запрашивают.

Я не знаю, в чем проблема?на стороне клиента или на стороне сервера?

1 Ответ

0 голосов
/ 20 апреля 2019

В итоге я обнаружил, что причина не в параллелизме.это вызвано опциями LB и keep-alive.Пока сервер отправляет FIN, LB удаляет информацию о соединении через 2 минуты, независимо от того, отправляет ли клиент FIN.Клиент не отправил FIN на сервер, и после tcpkeepalivetime клиент начнет отправлять детекторное сообщение, но LB не распознает, потому что информация о соединении удалена.поэтому клиент будет повторять попытки tcpkeepaliveprobes, а затем отправлять RST.После этого, если клиент отправляет что-либо, возникает TimeoutError.В моем приложении сервер не отправляет сообщения активно.Мое решение для такой ситуации: перед отправкой клиентом проверьте, доступен ли сокет для чтения, если сокет доступен для чтения, соединение не является нормальным, необходимо закрыть сокет и повторно подключиться к серверу.

(проститемой плохой английский, я надеюсь, что это может кому-то помочь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...