Node, postgres pg-promise: утечка активных дескрипторов ТОЛЬКО в контейнере azure webapp

У меня есть приложение node, которое использует библиотеку pg-promise для общения с postgres. Он настроен точно в соответствии с рекомендациями и с использованием pg-promise-demo.

Некоторые сведения о приложении: использует базу данных postgis для выполнения около 40 параллельных запросов к различным таблицам и возврата аналитики. Каждый параллельный запрос (задачи) возвращается через события API и сокета. В основном принимает полигон как область интереса и возвращает 40 событий после обработки данных для каждого. Мы используем pm2 для запуска процессов узла и их мониторинга.

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

Ожидаемое поведение

Каждый запрос (область интереса) запускает 41 активный дескриптор (как показано на снимке экрана ниже), соответствующий соединениям, которые пул проверяет из postgres. Теперь во всех тестах, кроме azure, активные дескрипторы увеличиваются на 41 за раз, а в зависимости от нагрузки — больше.

Когда данные обрабатываются, postgres в конечном итоге (около 30 секунд) разрывает соединения (как проверено pg_stat_activity). В конце концов активные дескрипторы переходят в процесс узла, как и ожидалось.

Фактическое поведение

Только в лазурном веб-приложении эти активные дескрипторы в приложении узла никогда не пропадают! они со временем увеличиваются, и в конечном итоге приложение аварийно завершает работу. Я подтвердил, что postgres правильно сбрасывает соединения. Просто этот узел не восстанавливает эти дескрипторы. Поскольку код отлично работает и масштабируется во всех установках, отличных от Azure, очень сложно отладить, почему это может происходить.

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

Отладка уже выполнена:

  1. Это не связано с сокетами. Подтверждено удалением их из уравнения.
  2. Большинство настроек postgres одинаковы. Производственный постгрес на лазурном просто намного мощнее.
  3. Пробовал без SSL-соединений.
  4. Подтверждено, что весь код правильно использует задачи там, где это необходимо для связанных запросов.
  5. Активные дескрипторы правильно собираются в нелазурных установках.
  6. Все исключения корректно обрабатываются и устраняются такие возможности утечек.
  7. Никаких видимых исключений или ошибок в Azure, когда это происходит. Как в логах приложения, так и в логах postgres.
  8. Активные дескрипторы возвращаются в нормальное состояние при перезапуске pm2.

image

Окружающая обстановка


person Shaunak    schedule 21.06.2018    source источник


Ответы (1)


Это была проблема, которая была исправлена, начиная с версии 7.4.2 node-postgres драйвер, что означает, что если вы используете последнюю версию pg-promise (8.4.4 на данный момент) больше такой проблемы быть не должно.

person vitaly-t    schedule 21.06.2018