Докер блокирует исходящие соединения при высокой нагрузке?
У нас есть веб-сервер node.js, который делает некоторые исходящие HTTP-запросы внешним API. Он работает в докере, используя dokku.
После некоторого времени загрузки (30 секунд/с) эти исходящие запросы больше не получают ответов.
Здесь график, который я сделал при тестировании с постоянным req/s:
![graph]()
incoming
и outgoing
- количество одновременных запросов (а не количество инициализированных запросов). (Трудно видеть на графике, но он довольно постоянный при ~ 10 запросах для каждого.)
response time
предназначен только для внешних запросов.
Вы можете ясно видеть, что они начинают внезапно проваливаться (поражая наш тайм-аут 1000 мс).
Чем больше req/s мы отправляем, тем быстрее мы сталкиваемся с этой проблемой, поэтому у нас должен быть какой-то предел, с которым мы приближаемся к каждому запросу.
Я использовал netstat -ant | tail -n +3 | wc -l
на хосте, чтобы получить количество открытых соединений, но это было всего ~ 450 (большинство из них TIME_WAIT
). Это не должно превышать ограничение на сокет. Мы также не сталкиваемся с ограничениями на ОЗУ или ЦП.
Я также попробовал запустить одно и то же приложение на одной машине снаружи докера, а это только в докере.
Ответы
Ответ 1
Это может быть связано с прокси-сервером Docker. Если вы используете последнюю версию Docker, попробуйте запустить демон с опцией --userland-proxy=false
. Это заставит Docker обрабатывать переадресацию порта только с помощью iptables, и накладные расходы меньше.