LINUX.ORG.RU
ФорумAdmin

Как получить видимость в производительность БД?

 , , ,


0

3

Сегодня с утра лёг сайт. Самое противное - что не понятно, почему. Обновлений не было, всё примерно как обычно. Сайт на жаве. В логах таймауты коннекта к базе. То бишь все коннекты к базе были чем-то заняты.

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

Пытаюсь понять, что в этой ситуации надо делать.

Понятно, что есть тупой вариант - поставить на сервере max_connections 1000000 (или сколько там постгрес переварит), поставить в пул тоже какое-нибудь дикое число коннектов и пускай начальник деньги платит за CPU и RAM.

Я хочу всё же попытаться по уму сделать. Для начала нужно вообще понять суть причины. У меня постгрес managed, к самому серверу доступа нет, только через SQL и в консоли немного статистики есть. В частности по статистике видна корреляция - был огромный всплеск в графике locks.

Пока у меня такой план:

Написать программу, которая мониторит pg_stat_activity. Исходя из этой таблицы выписать запросы, которые долго выполняются. Пока не разобрался - возможно ли это, но на первый взгляд вроде полей там много, наверное - возможно. Кстати может уже есть такая программа?

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

Тут одна из проблем в том, что в запросе вместо конкретных параметров стоят placeholder-ы ($1 и тд). Без конкретных параметров воспроизвести запрос непонятно как. Как-то можно вытащить набор конкретных параметров в pg_stat_activity?

С этим вроде разобрался параметром preferQueryMode=simple в JDBC URL…

Альтернативно можно пойти со стороны приложения. Программисты не знают, как это сделать, я думал написать свой JDBC драйвер, который будет логгировать долгие запросы уже со всеми параметрами, ему-то всё приходит. Но это долгая история, я таким когда-то занимался, не самая простая задача. В принципе есть log4jdbc, вроде даже он ожил, раньше вроде мёртвый был, возможно он подойдёт. Но хотелось бы более универсальный подход, т.к. приложений много и не все на Java. И вообще лезть в них неохота лишний раз.

★★★★

Последнее исправление: hobbit (всего исправлений: 3)

У меня постгрес managed, к самому серверу доступа нет

Значит кто-то же его за вас «managed». Амазон какой, или кто попроще. Если это не настоящий ПГ, а какой-то облачный - то запросто что-то там у них в облаке и запуталось.

Я за неприлично долгими запросами смотрю в логи, с log_min_duration_statement = 2000.

Поскольку у меня люди не имеют доступа к самим таблицам - они запрашивают процедуры с SCURITY DEFINER и правильно выставленным OWNER. Вот внутри этих процедур я собираю уже более подробные логи в свою отдельную UNLOGGED табличку - кто, когда, с какими параметрами, и как долго.

Кстати накаркал.

2024-06-07 05:15:03.780 UTC [2452550] vasya@db1:1.2.3.4 LOG:  duration: 5100.132 ms  execute <unnamed>: [bla_bla_bla]
2024-06-07 05:15:03.780 UTC [2452550] vasya@db1:1.2.3.4 DETAIL:  parameters: $1 = 't', $2 = '1', [bla_bla_bla]
Пошел смотреть, что хотел-то этот Вася.

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 2)

постгрес managed

К нему должна аналитика прилагаться. Как минимум можно настроить лог запросов (медленных, или вообще всех).

То бишь все коннекты к базе были чем-то заняты

Не факт что они были прямо заняты-заняты, а не гоняли SELECT 1+1 раз в минуту. pgbouncer, или что-то подобное у тебя настроено?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

К нему должна аналитика прилагаться. Как минимум можно настроить лог запросов (медленных, или вообще всех).

Не прилагается. Метрики вытаскивают некоторые, но по ним мало что мне понятно кроме факта, что процессор в сервере с БД ушёл на 100% и load улетел в небеса.

Не факт что они были прямо заняты-заняты, а не гоняли SELECT 1+1 раз в минуту

Там пул в приложении, не думаю, что с ним проблемы.

pgbouncer, или что-то подобное у тебя настроено?

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

vbr ★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Пытаюсь понять, что в этой ситуации надо делать.

Ну хз даже, что тебе посоветовать, если разрабы хер забили. «пускай начальник деньги платит за CPU и RAM», ну или менять место работы, наверное.

Допустим ты настроишь логи, найдёшь медленные запросы. Дальше что? «Программисты не знают»? Беги оттуда.

no-such-file ★★★★★
()

Понятно, что есть тупой вариант - поставить на сервере max_connections 1000000 (или сколько там постгрес переварит), поставить в пул тоже какое-нибудь дикое число коннектов и пускай начальник деньги платит за CPU и RAM.

Это самый умный вариант. Ваша задача — решить проблему. Пропишите параметры, чтоб сайт не падал и сообщите о проблеме на верх. Думать о том, что сейчас важнее, оптимизировать производительность или пилить фичи, что дешевле: платить за тормоза или нанимать команду программистов, которые сделают, чтоб не тормозило — задача начальника. А вы не должны присваивать себе его полномочия.

ugoday ★★★★★
()

У меня постгрес managed, к самому серверу доступа нет

значит и решить проблему ты не можешь. Её могут решить только те кто managed этот постгрес, может у них всё облако зависло и вот твой постгрес вместе с ним, максимум что ты можешь сделать - это поднять копию у себя, чтоб ты сам был тем управляет постгресом и погонять на локальной копии стресстесты, исходя из них понять какие запросы совсем говно-говном. Но это много твоего рабочего времени займёт, начальник будет недоволен. Сайт у вас не основное направление похоже, а так, для галочки. Иначе не ты бы бегал по ЛОР-у а твоё начальство бы бегало как в жопу ужаленное.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Написать программу, которая мониторит pg_stat_activity. Исходя из этой таблицы выписать запросы, которые долго выполняются. Пока не разобрался - возможно ли это, но на первый взгляд вроде полей там много, наверное - возможно. Кстати может уже есть такая программа?

https://www.postgresql.org/docs/current/pgstatstatements.html. Единственное что придется конфиг поправить и рестартануть для того что-бы это включить.

Тут одна из проблем в том, что в запросе вместо конкретных параметров стоят placeholder-ы ($1 и тд). Без конкретных параметров воспроизвести запрос непонятно как. Как-то можно вытащить набор конкретных параметров в pg_stat_activity?

Скорее всего никак, но можно включить логгирование медленных запросов (log_min_duration_statement). Там будут конкретные параметры. И еще бывает auto explain.

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Нагрузка на CPU улетела на 100%. Я рестартанул нужные сервисы, через pg_terminate прибил лишние коннекты (они почему-то не отвалились сами), это решило проблему на конкретный момент.

На IO нагрузки особой вроде нет. Там по-моему вся используемая часть базы в кеше лежит.

Еще по локам огромный всплеск был.

vbr ★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от maxcom

https://www.postgresql.org/docs/current/pgstatstatements.html. Единственное что придется конфиг поправить и рестартануть для того что-бы это включить.

Спасибо, похоже, что уже всё включено, добавил extension и появилось, буду разбираться.

vbr ★★★★
() автор топика