Пассажир использует больше соединений PostgreSQL, чем ожидалось - PullRequest
0 голосов
/ 01 октября 2018

Сложная проблема, возникающая в производстве в течение длительного времени, мы понятия не имеем, откуда она взялась.Может иногда воспроизводить его на локальном хосте, поддержка Heroku Enterprise не имеет для этого никакого смысла.

В нашей производственной базе данных в настоящее время мы имеем следующую настройку:

  • Passenger Standalone, многопоточность отключена, ограничено 25 процессами MAX.Нет минимальной настройки.
  • 3 веб-дин

a SELECT * FROM pg_stat_activity GROUP BY client_addr и подсчет количества соединений на экземпляр показывает, что более одного соединения PSQL открыто для одного пассажирского процесса во время нашего пикадней.

Допущения:

  • Один адрес равен одному Dyno (подтверждено персоналом Heroku)
  • Пассажир не порождает более 25 процессов одновременно (подтвержденос passenger-status во время этих пиков)

Вот скриншот того, что выглядит как SELECT * FROM pg_stat_activity;:

enter image description here На скриншоте мы можемобратите внимание, что есть 45 psql соединений , поступающих от того же динамо, которое управляет пассажиром.Если мы следуем нашей предыдущей логике, у нее не должно быть более 1 соединения на процесс Passenger, поэтому 25.

Журналы не выглядят необычно, ничего не упоминая ни о сбое dyno / сбое процесса.

Вот скриншот нашего статуса пассажира для того же динамо (в другое время, просто чтобы доказать, что для одного динамо создано не больше 25 процессов): enter image description here

И, наконец, один из ответов, которые мы получили от службы поддержки Heroku (Кстати, потрясающая поддержка)

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

В документации для Пассажира объясняется, что Пассажир сам обрабатывает соединения ActiveRecord.

Любые выводы приветствуются.Спасибо!

Различная информация:

  • Версия Ruby: 2.4.x
  • Версия Rails: 5.1.x
  • Версия для пассажиров:5.3.x
  • PG Версия: 10.x
  • ActiveRecord Версия: 5.1.x

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

И последнее. : Мы используем ActionCable.Я где-то читал, что пассажир странно обрабатывает сокетные соединения (открывает несколько скрытый процесс, чтобы поддерживать соединение).Это один из наших вариантов, но пока не повезло в воспроизведении на localhost.Если кто-нибудь может подтвердить, как Пассажир обрабатывает соединения ActionCable, он будет очень признателен.

Обновление 1 (01/10/2018):

Эксперимент:

  • Отключите функцию автоматического объяснения NewRelic, как описано здесь: https://devcenter.heroku.com/articles/forked-pg-connections#disabling-new-relic-explain
  • Локально запустите сервер Passenger с минимальным и максимальным размером пула, установленным в 3 (чем больше, тем больше горит мой компьютер), затемуничтожить процесс с помощью различных сигналов (SIGKILL, SIGTERM), чтобы попытаться проверить, правильно ли закрыты соединения.Они есть.

1 Ответ

0 голосов
/ 22 октября 2018

Нам, наконец, удалось решить проблему с пассажиром.У нас была эта проблема на самом деле очень давно.

Исправление

Если вы используете ActionCable, и по умолчанию используется кабельный маршрут /cable, измените Procfile с:

web: bundle exec passenger start -p $PORT --max-pool-size $PASSENGER_MAX_POOL_SIZE

в

web: bundle exec passenger start -p $PORT --max-pool-size $PASSENGER_MAX_POOL_SIZE --unlimited-concurrency-path /cable

Пояснение

Перед изменением каждое соединение сокетов (ActionCable) будет проходить один процесс в Passenger.Но Socket - это то, что не должно занимать целый процесс.Процесс может обрабатывать множество соединений с открытым сокетом.(Многие - более 10 тысяч одновременно для некоторых громких имен).К счастью, у нас гораздо меньше соединений с сокетами, но все же.

После изменения мы в основном сказали Пассажиру не предпринимать целый процесс для обработки одного соединения через сокет, а скорее посвятили целый процесс обработке всех соединений через сокет..

Документация

Некоторые метрики, через 3 недели с исправлением

  • Количество разветвленных процессов в Пассажире резко сократилось (с 75 до ~ 15 процессов)
  • глобальное использование памяти в веб-динамо резко сократилось (по сравнению с предыдущим пунктом для разветвленных процессов Passenger)
  • Общее количество подключений PSQL резко сократилось и оставалось стабильным в течение двух дней (даже после развертывания).(от 150 до ~ 30 соединений)
  • Количество соединений PSQL на динамо резко уменьшилось (с ~ 50 на дина до менее 10 на дина)
  • Количество подключений Redis уменьшилось и оставалось стабильным в течение двух дней (даже после развертывания)
  • Среднее использование памяти в PostgreSQL резко уменьшилось и оставалось стабильным в течение двух дней.
  • Общая пропускная способность немного выше обычной (Пропускная способность - это количество запросов, обрабатываемых в минуту)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...