Сервер Python Socket неожиданно закрывает соединение в перегруженной сети - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть Python2.7 Socketserver, который отвечает на запросы через перегруженную локальную сеть.(Представьте себе кластер компьютеров, на которых указанный сервер python общается с одним контроллером через коммутатор).

На другой стороне TCP-соединения находится приложение NodeJS, выступающее в роли клиента для сервера.

Проблема возникает ок.1/1000 запросов и, казалось бы, случайно.Клиент NodeJS сообщит об ошибке «ECONNRESET», но большую часть времени получает все данные.Около 1/10 этих ошибок выдает «ECONNRESET» до получения всех данных.

После тщательного изучения я обнаружил, что проблема заключается в SocketServer.Я попытался использовать клиент C, а также клиент Python, и оба сообщают свою версию одной и той же ошибки.

Я также обнаружил (см. Код ниже), что на сервере сокетов, если я поставлю "sleep (0.25) "после всех операций записи, но до возврата в функции дескриптора эта ошибка больше не возникает.(Проверено с ~ 3 000 000 запусков).

Это наводит меня на мысль, что существует некоторое странное взаимодействие с сервером сокетов, заставляющее соединение закрываться, но один из более ранних пакетов требует повторной передачи, или что-то подобноелиний, но документация на сервере сокетов довольно проста.

from time import sleep
import SocketServer

class ThreadedServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

class ThreadedRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        req = parseRequest()
        res = processRequest()
        self.request.send(res)
        sleep(0.25)
        return

def main():
    server = ThreadedServer((parameters.HOST, server_port), ThreadedRequestHandler)
    server.serve_forever()

if __name__ == "__main__":
    main()

Я, конечно, удалил бизнес-логику, но проблема связана со сном после отправки.С этим нет никаких проблем, без него иногда неожиданное закрытие сервера / последние не отправляемые пакеты.Это заставляет меня поверить, что это связано с отброшенными пакетами и принудительным закрытием сервера, но это может быть что-то еще.

Любая помощь будет принята с благодарностью, и если что-то неясно, я могу уточнить.

...