Ответы:
Вы можете сопоставить конкретный внутренний идентификатор Postgres с идентификатором системного процесса, используя pg_stat_activity
системную таблицу.
SELECT pid, datname, usename, query FROM pg_stat_activity;
может быть хорошей отправной точкой.
Как только вы узнаете, какие запросы выполняются, вы можете продолжить расследование ( EXPLAIN
/ EXPLAIN ANALYZE
; проверить блокировки и т. Д.)
WHERE
предложения, но если у вас нет большого количества PID, это так же, как легко искать через полный вывод. Руководство Postgres содержит дополнительную информацию о том, что вы можете получитьpg_stat_activity
, а также другие таблицы сбора статистики (которые могут помочь вам, если ваша проблема не в пользовательском запросе).
У меня была такая же проблема. Postgresql настроен на AWS RDS, и его загрузка процессора составила 100% даже после увеличения экземпляра. Я отладил с помощью метода, показанного здесь, и один из методов работал для меня.
Я проверил, выполняется ли запрос дольше всего, и узнал, что некоторые запросы зависли и выполнялись более 3-4 часов. Чтобы узнать, сколько времени выполняется запрос, выполните следующую команду:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
Если это больше часа, то это проблема. Убейте долго работающее соединение и ограничьте максимальный возраст соединения со стороны приложения.
Если это действительно почтмейстер, использующий весь этот процессор, то, скорее всего, у вас проблемы с блокировкой, возможно, из-за очень высокой нагрузки max_connections
. Рассмотрите возможность уменьшения max_connections
и использования пула соединений, если это так.
В противном случае: Подробности, пожалуйста. Полный вывод top -b -n 1
для начала.
postgress
,postgres
и вы только что скопировали это вручную.