Как найти причину падения \ замедления работы сервера с PostgreSQL?

Доброго вечера.
Ситуация: весьма мощный сервер (8gb, новый xeon) с довольно нагруженным приложением, 10+ потоков postgres, которые грузят в совокупности систему на 60-80%. При этом все работает шустро, просто они постоянно работают. Так все длится 2-3 месяца, но периодически от клиента сыплется жалоба, что что-то висит, я смотрю - и правда. В /top пара процессов postgres с ненормально высоким CPU (оба по 40) и ненормально долгим временем исполнения. Перезапускаю сервер, все снова хорошо на пару месяцев.

На тяжелые запросы не грешу, т.к., во-первых, билд запросов на 100% отдан ORM (Eloquent, Lumen), и возможность кривыми руками написать какой-нибудь count(*) сведена к нулю; а во-вторых, если причина в кривых запросах, то виснуть должно периодически (на время выполнения собственно запроса), и не должно становиться лучше после перезапуска. Такое чувство, словно какой-то редкий баг или ситуация раз в три месяца ломают всю систему. Если бы встречалось постоянно, то, возможно, уже нашел бы и исправил, а тут - хз, хз.

Дедлоки? Такого быть не должно, т.к. в 2к19 почти все серверы бд сами детектят и убивают дедлоки, и постгрес не исключение. Да и стандартное время выполнения скрипта (если допустить, что все же причиной является инициированная пользователем операция) должно прерывать исполнение, а там дикие значения в десятки часов исполнения.

Как найти причину? Куда смотреть? Настроил вроде как нормально, с памятью тоже все хорошо (/free выдает, что около 30% свободно). Пока подумываю сделать перезапуск postgres по крону раз в месяц, это решило бы проблему, но это симптоматическое лечение, и в целом не годится.
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
весьма мощный сервер (8gb

Дааааа? А я думал дохленькая виртуалочка. Довольно средние железки на 256гб тогда что?

На тяжелые запросы не грешу, т.к., во-первых, билд запросов на 100% отдан ORM (Eloquent, Lumen), и возможность кривыми руками написать какой-нибудь count(*) сведена к нулю

Ха. Хахахаха. Хорошая шутка.
Самый лютый бред вместо запросов делают именно ORM.

Выкручивать настройки логирования, в момент проблемы смотреть хотя бы вот это: https://github.com/dataegret/pg-utils/blob/master/...
Ставить какой-то мониторинг, умеющий мониторить базу.
И смотреть что именно делает база и чем занято железо в момент проблемы. Особенно I/O. process title бы хоть сохранили/написали. Там и то продублирован command tag.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы