Серьезная проблема, возникающая в продакшене в течение долгого времени, мы понятия не имеем, откуда она взялась. Иногда может воспроизводить его на локальном хосте, служба поддержки Heroku Enterprise ничего не знает об этом.
В нашей производственной базе данных в настоящее время есть следующие настройки:
SELECT * FROM pg_stat_activity GROUP BY client_addr и подсчет количества подключений на каждый экземпляр показывает, что в наши пиковые дни открыто более 1 PSQL-подключения для одного пассажирского процесса.
Предположения:
passenger-status во время этих пиков)Вот скриншот того, как выглядит SELECT * FROM pg_stat_activity;:
На скриншоте мы видим, что 45 подключений psql исходит от того же динамометрического стенда, на котором работает пассажир. Если мы следовали нашей предыдущей логике, у него не должно быть более одного соединения на процесс Пассажира, поэтому 25.
Журналы не выглядят необычно, ничего не упоминается ни о сбое динамометрического стенда, ни о сбое процесса.
Вот скриншот нашего статуса пассажира для одного и того же динамометрического стенда (в разное время, просто чтобы доказать, что для одного динамометрического стенда создано не более 25 процессов):

И, наконец, один из ответов, которые мы получили от службы поддержки Heroku (Замечательная поддержка, кстати)
I have also seen previous reports of Passenger utilising more connections than expected, but most were closed due to difficulty reproducing, unfortunately.
В документации Passenger поясняется, что Passenger самостоятельно обрабатывает соединения ActiveRecord.
Любые лиды приветствуются. Спасибо!
Различная информация:
2.4.x5.1.x5.3.x10.x5.1.xЕсли вам нужна дополнительная информация, просто дайте мне знать в комментариях, я с радостью обновлю этот пост.
Последняя вещь: Мы используем ActionCable. Я где-то читал, что пассажир странно обрабатывает соединения сокетов (открывает несколько скрытый процесс, чтобы поддерживать соединение). Это один из наших зацепок, но пока не удалось воспроизвести его на localhost. Если кто-нибудь может подтвердить, как Passenger обрабатывает соединения ActionCable, мы будем очень признательны.
Обновление 1 (10.01.2018):
Опробовал:





Наконец-то нам удалось решить проблему с Passenger. На самом деле, у нас была эта проблема очень давно.
Исправление
Если вы используете 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. Но на самом деле сокет - это то, что не должно занимать целый процесс. Процесс может обрабатывать множество открытых сокетов. (Многие - это более 10 тысяч одновременно для некоторых громких имен). К счастью, у нас гораздо меньше сокетов, но все же.
После изменения мы в основном сказали Пассажиру, чтобы он не брал весь процесс для обработки одного сокет-соединения, а посвятил целый процесс обработке всех сокет-соединений.
Документация
Некоторые показатели после 3 недель исправления