Докер блокирует исходящие соединения при высокой нагрузке?

У нас есть веб-сервер node.js, который делает некоторые исходящие HTTP-запросы к внешнему API. Он работает в докере с использованием dokku.
Через некоторое время загрузки (30req / s) эти исходящие запросы больше не получают ответов.

Вот график, который я построил во время тестирования с постоянными запросами / с: graphincoming и outgoing - количество одновременных запросов (не количество инициализированных запросов). (Это трудно увидеть на графике, но он довольно постоянен и составляет ~ 10 запросов для каждого.)
response time предназначен только для внешних запросов. Вы можете ясно видеть, что они начинают выходить из строя внезапно (достигнув нашего тайм-аута 1000 мс).


Чем больше запросов в секунду мы отправляем, тем быстрее мы сталкиваемся с этой проблемой, поэтому у нас должен быть какой-то предел, к которому мы приближаемся с каждым запросом.


Я использовал netstat -ant | tail -n +3 | wc -l на хосте, чтобы получить количество открытых соединений, но оно было всего ~ 450 (большинство из них TIME_WAIT). Это не должно превышать предел сокета. Мы также не достигли пределов ОЗУ или ЦП.


Я также пробовал запустить то же приложение на том же компьютере вне докера, и это происходит только в докере.


person jomo    schedule 14.07.2015    source источник
comment
Вы пробовали запускать его внутри Docker, но не внутри Dokku?   -  person blacklabelops    schedule 17.07.2015
comment
Определите «обрабатывается в настоящее время». 1000 мс - слишком мало для тайм-аута запроса. Попробуйте что-нибудь разумное, например, десять секунд.   -  person user207421    schedule 17.07.2015
comment
@maybeg Я не слышал, потому что ребята из dokku сказали мне, что не трогают никакие сетевые вещи. Я попробую позже.   -  person jomo    schedule 17.07.2015
comment
@EJP 1000 мс на самом деле много для внешнего запроса API. Однако результат не изменился, когда я его увеличил. (И ни один из наших пользователей не ждет более 10 секунд завершения HTTP-запроса)   -  person jomo    schedule 17.07.2015
comment
@jomo На самом деле это не так уж и много. Вы находитесь в пределах диапазона таймаутов повтора TCP. Слишком коротко.   -  person user207421    schedule 19.07.2015
comment
@jomo - Есть информация о том, как запустить его без Dokku? Сейчас я работаю над проектом, использующим Docker, и хотел бы знать, является ли это проблемой докера или нет.   -  person blockcipher    schedule 20.07.2015
comment
Может быть связано с этим вопросом: stackoverflow.com/questions/ 30840817 /   -  person Regan    schedule 23.07.2015
comment
@Regan У нас действительно есть локальные подключения к redis (работает в другом контейнере). Я также подозревал, что это могло быть причиной проблемы, но проблема в докере не исчезла после удаления Redis.   -  person jomo    schedule 23.07.2015


Ответы (1)


Это могло быть из-за прокси-сервера Docker. Если вы используете последнюю версию Docker, попробуйте запустить демон с параметром --userland-proxy=false. Это заставит Docker обрабатывать переадресацию портов только с помощью iptables, что снизит накладные расходы.

person Mark Duncan    schedule 19.07.2015
comment
Я только что попробовал, похоже, разницы нет. - person jomo; 20.07.2015
comment
@jomo, в этом случае это может быть конфигурация ядра. Возможно, этот вопрос / ответ SO может дать вам что-то, что можно найти в stackoverflow.com/questions/410616/ - person Mark Duncan; 21.07.2015
comment
это то, что мы изначально думали, это проблема, но это не объясняет, почему этого не происходит вне докера (где у нас на самом деле было больше подключений, чем в докере) - person jomo; 21.07.2015
comment
Ваш ответ на самом деле не решил мою проблему, но я скорее дам награду кому-нибудь вместо того, чтобы позволить ей исчезнуть навсегда. Удачи :) - person jomo; 23.07.2015
comment
@jomo можно ли вывести вывод 'sysctl net' в контейнер и из контейнера? Я почти уверен, что пространство имен сети может иметь разные параметры sysctl для сетевых вещей. - person flumpb; 23.07.2015
comment
comment
@jomo что-нибудь торчит в логах или dmesg, когда исходящие соединения начинают обваливаться? - person flumpb; 24.07.2015
comment
@jomo Мне интересно, может ли вам помочь этот ответ: узел stackoverflow.com/questions/17033631/ Я начинаю думать, что это может быть nodejs вместо Docker, но, возможно, что-то в Docker запускает его. - person Mark Duncan; 25.07.2015
comment
@MarkDuncan ulimit, похоже, не проблема, мы это тоже проверили: | - person jomo; 25.07.2015
comment
@jomo Я в недоумении. Если вы это выясните, опубликуйте решение. Удачи. - person flumpb; 26.07.2015