Устранение проблем с высокой загрузкой ЦП в сервисах postgres и postmaster?

28

Я использую машину с открытым исходным кодом (RHEL 6.2) под управлением программного обеспечения SIEM. Когда я запускаю topкоманду, я вижу postgresи то и postmasterдругое с загрузкой процессора 96%. Есть ли способ уточнить или посмотреть, что заставляет эти службы складываться?

asadz
источник
2
"RHCE 6.2"? Вы имеете в виду "RHEL 6.2"? Я полагаю postgress, postgresи вы только что скопировали это вручную.
Крейг Рингер,

Ответы:

30

Вы можете сопоставить конкретный внутренний идентификатор Postgres с идентификатором системного процесса, используя pg_stat_activityсистемную таблицу.

SELECT pid, datname, usename, query FROM pg_stat_activity;может быть хорошей отправной точкой.
Как только вы узнаете, какие запросы выполняются, вы можете продолжить расследование ( EXPLAIN/ EXPLAIN ANALYZE; проверить блокировки и т. Д.)

voretaq7
источник
это точный запрос, я не очень хорошо знаком с db, так как я являюсь вторым парнем, работающим над siem, вашим оператором select, я должен кормить его pid из верхней команды?
asadz
1
@asadz нет, оно было усечено (исправлено сейчас) - если у вас есть конкретные PID и вы хотите посмотреть, что они работают, вы можете изолировать их с помощью WHEREпредложения, но если у вас нет большого количества PID, это так же, как легко искать через полный вывод. Руководство Postgres содержит дополнительную информацию о том, что вы можете получитьpg_stat_activity , а также другие таблицы сбора статистики (которые могут помочь вам, если ваша проблема не в пользовательском запросе).
voretaq7
Когда я выполняю этот запрос, у меня нет подозреваемого PID
Fendi Tri Cahyono
Спасибо за подсказку, недавно я столкнулся с подобной проблемой и выяснил причину, используя SELECT * FROM pg_stat_activity;
Яо
14

У меня была такая же проблема. Postgresql настроен на AWS RDS, и его загрузка процессора составила 100% даже после увеличения экземпляра. Я отладил с помощью метода, показанного здесь, и один из методов работал для меня.

Я проверил, выполняется ли запрос дольше всего, и узнал, что некоторые запросы зависли и выполнялись более 3-4 часов. Чтобы узнать, сколько времени выполняется запрос, выполните следующую команду:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');

Если это больше часа, то это проблема. Убейте долго работающее соединение и ограничьте максимальный возраст соединения со стороны приложения.

Аджит Хан
источник
8

Если это действительно почтмейстер, использующий весь этот процессор, то, скорее всего, у вас проблемы с блокировкой, возможно, из-за очень высокой нагрузки max_connections. Рассмотрите возможность уменьшения max_connectionsи использования пула соединений, если это так.

В противном случае: Подробности, пожалуйста. Полный вывод top -b -n 1для начала.

Крейг Рингер
источник
это имеет смысл; поскольку аналитик используется для запроса большого количества данных взад и вперед; есть ли способ проверить состояние блокировки; или условия, приписанные ему; ?
asadz