node.js, сокеты TCP и докер — почему соединение сбрасывается узлом с более чем 32 одновременными соединениями?

Я совершенно новичок в Docker со вчерашнего дня. У меня есть запущенный сервер node.js, который просто создает TCP-сервер, а затем обрабатывает сообщения, поступающие от клиента. Существует тестовая программа, написанная кем-то другим, которую я запускал и которая позволяет использовать столько одновременных подключений, сколько вы хотите.

Когда я запускаю его локально, я могу иметь более 100 одновременных подключений без проблем. Однако иногда я вижу локальную проблему, когда начинаю выполнять более 200 одновременных подключений, и это фактически попадает в случай socket.on(error) и выдает мне ошибку. Однако, если я запущу сервер сразу и попробую 200 одновременных подключений, он обычно успешно завершится, но последующие попытки завершатся ошибкой.

Однако, когда я запускаю жгут с сервером, работающим в Docker, как только я пытаюсь запустить его с 33 одновременными подключениями, он не работает. Я получаю сообщение об ошибке «сброс соединения по узлу» из тестовой системы. Если я пробую 32 соединения, все работает нормально. Когда пробую 33+, тоже не вижу никакой ошибки на сервере, как при локальном запуске. Если я попытаюсь снова выполнить 32 одновременных соединения после того, как он потерпит неудачу с 33+, все будет хорошо.

Кто-нибудь знает, почему это может происходить? Есть ли какая-то настройка в Docker, которую я должен изменить, чтобы разрешить более 32 одновременных подключений? Мне кажется интересным, что это жесткое ограничение 32, и оно всегда работает с 32 и никогда не работает с 33.

FWIW, на моем сервере node.js он прослушивает port 8080 и host 0.0.0.0. Первоначально он был у меня на 127.0.0.1, но хотя он работал локально, он не работал в Docker. Чтобы запустить его, я использую команду docker run -p 8080:8080 app.

Я запускаю Docker на своем MacBook Pro с последней версией OSX.

Любые идеи?


person Drew S.    schedule 19.03.2018    source источник
comment
На какой платформе вы используете Docker? Что ваше приложение делает с точки зрения обработки? Что произойдет, если вы запустите тестовую обвязку в контейнере или в другом контейнере в той же сети докеров?   -  person Matt    schedule 19.03.2018
comment
Я работаю на OSX (обновил свой пост). Приложение читает сообщения, поступающие от клиента, подключенного через сокет TCP, и записывает клиенту сообщение об успехе, неудаче или ошибке в зависимости от того, что происходит. Я еще не пробовал запускать жгут из Docker, так что, возможно, это хороший следующий шаг. Тестовая система представляет собой исполняемый файл, поэтому мне нужно выяснить, как это сделать с помощью Docker.   -  person Drew S.    schedule 19.03.2018
comment
Существуют некоторые фундаментальные различия между тестированием на локальном хосте и в Docker for Mac VM, но они не должны быть такими серьезными.   -  person Matt    schedule 20.03.2018
comment
В этом вопросе оп упоминает, что помог сброс к заводским настройкам.   -  person Matt    schedule 20.03.2018