Solucionando problemas de alto uso da CPU nos serviços postgres e postmaster?

28

Estou usando uma máquina baseada em código aberto (RHEL 6.2) executando o software SIEM. Quando executo o topcomando, vejo postgrese postmasterambos com 96% de uso da CPU. Existe uma maneira de identificar ou ver o que está causando o empilhamento desses serviços?

asadz
fonte
2
"RHCE 6.2"? Você quer dizer "RHEL 6.2"? Presumo postgressé postgrese você acabou copiado à mão.
Craig Ringer

Respostas:

30

Você pode associar um ID de back-end específico do Postgres a um ID de processo do pg_stat_activitysistema usando a tabela do sistema.

SELECT pid, datname, usename, query FROM pg_stat_activity;pode ser um bom ponto de partida.
Depois de saber quais consultas estão sendo executadas, você poderá investigar mais ( EXPLAIN/ EXPLAIN ANALYZE; verificar bloqueios etc.)

voretaq7
fonte
esta é a consulta exata, eu não estou muito familiarizado com o db como eu sou o cara que trabalha em siem, sua instrução select, eu tenho que alimentá-lo pid do comando top?
Asadz
11
@asadz não, foi truncado (corrigido agora) - Se você possui PIDs específicos e deseja ver o que eles estão executando, você pode isolá-los com uma WHEREcláusula, mas se você não tiver um grande número de PIDs, será fácil de pesquisar em toda a saída. O manual do Postgres possui detalhes adicionais sobre o que você pode obterpg_stat_activity , além de outras tabelas de coletor de estatísticas (que podem ajudá-lo se o seu problema não for uma consulta do usuário).
precisa saber é o seguinte
quando executo essa consulta, não há PID que eu
deva
Obrigado pela pista, recentemente encontrei um problema semelhante e descobri o motivo usando SELECT * FROM pg_stat_activity;
Yao
14

Eu estava tendo o mesmo problema. O postgresql está configurado no AWS RDS e estava com 100% de utilização da CPU, mesmo depois de aumentar a instância. Depurei o método mostrado aqui e um dos métodos funcionou para mim.

Eu verifiquei a consulta em execução por mais tempo e soube que determinadas consultas estavam emperradas e em execução há mais de 3-4 horas. Para verificar desde quanto tempo a consulta está em execução, execute o seguinte comando:

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

Se isso for mais de uma hora, esse é o problema. Mate a conexão de longa duração e limite a idade máxima da conexão do lado do aplicativo.

Ajeet Khan
fonte
8

Se este é realmente o postmaster usando toda essa CPU, é provável que você tenha problemas de contenção de bloqueio, provavelmente devido a muito alto max_connections. Considere diminuir max_connectionse usar um pooler de conexões, se esse for o caso.

Caso contrário: detalhes, por favor. Saída total de top -b -n 1para começar.

Craig Ringer
fonte
isso faz sentido; uma vez que o siem é usado pelo analista para consultar muitos dados e para trás; existe uma maneira de verificar o status do bloqueio; ou condições atribuídas a ele; ?
Asadz