Сегодня с утра лёг сайт. Самое противное - что не понятно, почему. Обновлений не было, всё примерно как обычно. Сайт на жаве. В логах таймауты коннекта к базе. То бишь все коннекты к базе были чем-то заняты.
Я программистов давно прошу, чтобы они что-то оптимизировали, но у них лапки, они даже не могут понять, какой запрос в базу уходит, какую-то шляпу мне скидывают со своего хибернейта.
Пытаюсь понять, что в этой ситуации надо делать.
Понятно, что есть тупой вариант - поставить на сервере max_connections 1000000 (или сколько там постгрес переварит), поставить в пул тоже какое-нибудь дикое число коннектов и пускай начальник деньги платит за CPU и RAM.
Я хочу всё же попытаться по уму сделать. Для начала нужно вообще понять суть причины. У меня постгрес managed, к самому серверу доступа нет, только через SQL и в консоли немного статистики есть. В частности по статистике видна корреляция - был огромный всплеск в графике locks.
Пока у меня такой план:
Написать программу, которая мониторит pg_stat_activity. Исходя из этой таблицы выписать запросы, которые долго выполняются. Пока не разобрался - возможно ли это, но на первый взгляд вроде полей там много, наверное - возможно. Кстати может уже есть такая программа?
Потом уже с этими запросами пытаться разбираться, может индекс какой добавить.
Тут одна из проблем в том, что в запросе вместо конкретных параметров стоят placeholder-ы ($1 и тд). Без конкретных параметров воспроизвести запрос непонятно как. Как-то можно вытащить набор конкретных параметров в pg_stat_activity?
С этим вроде разобрался параметром preferQueryMode=simple в JDBC URL…
Альтернативно можно пойти со стороны приложения. Программисты не знают, как это сделать, я думал написать свой JDBC драйвер, который будет логгировать долгие запросы уже со всеми параметрами, ему-то всё приходит. Но это долгая история, я таким когда-то занимался, не самая простая задача. В принципе есть log4jdbc, вроде даже он ожил, раньше вроде мёртвый был, возможно он подойдёт. Но хотелось бы более универсальный подход, т.к. приложений много и не все на Java. И вообще лезть в них неохота лишний раз.