Как я могу получить имя хоста и запрос, который был выполнен в подчиненной базе данных postgres, что привело к сбою системы в памяти

В моей ведомой базе данных произошел сбой памяти (недостаточно памяти) и она находится на стадии восстановления. Я хочу знать запрос, который вызывает эту проблему.

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

Я использую постгрес 9.4.

Если у кого-нибудь есть идеи?


person shruti garg    schedule 21.04.2020    source источник


Ответы (1)


Если вы установите log_min_error_statement на error (по умолчанию) или ниже, вы получите оператор, вызвавший ошибку нехватки памяти в журнале базы данных.

Но я предполагаю, что вы попали под действие убийцы Linux OOM, что приведет к завершению процесса PostgreSQL с сигналом 9, после чего база данных перейдет в режим восстановления.

Правильным решением здесь является отключение чрезмерного выделения памяти, установив vm.overcommit_ratio на 2 в /etc/sysctl.conf и активировав настройку с помощью sysctl -p (затем вы также должны правильно настроить vm.overcommit_ratio).

Тогда вы получите ошибку, а не убитый процесс, который легче отлаживать.

person Laurenz Albe    schedule 21.04.2020
comment
Если процесс завершается сигналом 9 с помощью OOM, то запросы также не регистрируются. В то же время у меня есть один длинный запрос в моих журналах непосредственно перед тем, как база данных перешла в режим восстановления. Должен ли я рассматривать этот запрос как куприт или медленный запрос ? - person shruti garg; 22.04.2020
comment
Зависит от. Если это регистрируется из-за log_min_duration_statement, нет (потому что это регистрируется после того, как это сделано). Если он регистрируется из-за log_statement, возможно. Я бы все же отключил OOM killer. - person Laurenz Albe; 22.04.2020