Como monitorar adequadamente o número de conexões com o banco de dados PostgreSQL?

10

Tentei usar um script Nagios para monitorar o número de conexões com o banco de dados Postgres e cheguei a este problema: elas são contadas como conexões abertas no momento e medidas a cada 5 minutos.

SELECT sum(numbackends) FROM pg_stat_database;

Ainda assim, isso parece perder um grande número de conexões de curta duração, portanto as estatísticas estão longe da realidade.

Tentei executar o script manualmente e observei grandes alterações, mesmo entre duas conexões feitas a poucos segundos de distância uma da outra.

Como eu pude obter essas informações de maneira confiável? como max (connectios) aconteceu durante um intervalo de tempo.

sorin
fonte
11
Estatísticas agregadas ao longo do tempo para conexões seriam boas, mas não acho que o PostgreSQL as colete atualmente. Veja os documentos postgresql.org/docs/current/static/monitoring-stats.html para obter detalhes.
Craig Ringer
@CraigRinger talvez eu possa configurar o Postgres ou os clientes para manter as conexões abertas por um longo período de tempo, para poder mensurá-las. Devido à configuração atual, tive um caso em que o postgres começou a recusar conexões. O monitoramento não conseguiu detectar isso porque isso aconteceu dentro do intervalo de 5 minutos e passou de abaixo do nível de aviso para acima do crítico em menos de 5 minutos. E este não foi um ataque de negação de serviço.
sorin
2
Sim, isso é um problema bastante interessante. Eu recomendo colocar um PgBouncerna frente da sua instância do PostgreSQL, ele enfileirará as conexões quando estiver muito ocupado, em vez de rejeitá-las. (Sim, é estúpido que o PostgreSQL não possa fazer isso sozinho, mas não é uma solução simples; veja as intermináveis ​​discussões nas listas de discussão sobre o pool interno).
Craig Ringer
7
E as conexões de log (usando log_connections e log_disconnections) no arquivo de log (por exemplo, csvlog) e, em seguida, use o pgBadger ou algo semelhante para extrair isso do arquivo de log?
A_horse_with_no_name
2
@a_horse_with_no_name Good point. Você pode até "ajustar" os logs com um cliente que apenas lê novas entradas de log, integrando-se a desconexões e conexões para obter um relatório quase em tempo real das conexões de pico durante um determinado período de tempo. Francamente, não deve ser tão complicado. Uma das minhas tarefas para o projeto AXLE ( axleproject.eu ) é implementar um pouco mais de auditoria, e talvez eu consiga encaixar isso ...
Craig Ringer

Respostas:

1

É melhor usar as ferramentas de monitoramento de carga de trabalho, como pgbadgerpara verificar as conexões com o banco de dados e a carga geral. Isso ajudará você a entender quais usuários estão se conectando por quanto tempo e quais consultas estão sendo disparadas por eles. Para obter informações sobre a instalação e configuração do pgbadger, consulte esta página.

Se você quiser apenas verificar o número de conexões ativas, poderá usar select count(*) from pg_stat_activity where state='active'

Lohit Gupta
fonte
0

Você pode usar a extensão com local_preload_libraries para fazer isso.

Algo assim:

#include "postgres.h"
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

void _PG_init(void)
{
  SPI_connect();
  int ret = SPI_execute("UPDATE logon_logs SET logged = logged + 1", false, 0);
  SPI_finish();
}

/*
 * _PG_fini
 * Uninstall the hook.
 */
void _PG_fini(void)
{
}

Ou, em vez disso, ATUALIZAR via NOTIFY

Roman Tkachuk
fonte
5
Por favor, tente melhorar sua resposta com algumas explicações sobre como proceder.
precisa saber é o seguinte