Come monitorare correttamente il numero di connessioni al database PostgreSQL?


10

Ho provato a usare uno script Nagios per monitorare il numero di connessioni al database su un database Postgres e ho riscontrato questo problema: queste vengono contate come connessioni aperte e misurate ogni 5 minuti.

SELECT sum(numbackends) FROM pg_stat_database;

Tuttavia, questo sembra perdere un numero enorme di connessioni di breve durata, quindi le statistiche sono lontane dalla realtà.

Ho provato a eseguire manualmente lo script e ho osservato grandi cambiamenti anche tra due connessioni effettuate a pochi secondi l'una dall'altra.

Come posso ottenere queste informazioni in modo affidabile? come max (connectios) si è verificato durante un intervallo di tempo.


1
Le statistiche aggregate nel tempo per le connessioni sarebbero buone, ma non credo che PostgreSQL le raccolga attualmente. Guarda i documenti postgresql.org/docs/current/static/monitoring-stats.html per i dettagli.
Craig Ringer,

@CraigRinger forse potrei configurare Postgres o i client per mantenere le connessioni aperte per un periodo di tempo più lungo, in modo da poterle misurare. A causa dell'attuale configurazione, ho avuto un caso in cui Postgres ha iniziato a rifiutare le connessioni. Il monitoraggio non è stato in grado di rilevarlo perché si è verificato entro l'intervallo di 5 minuti ed è passato dal livello di avviso inferiore al livello critico in meno di 5 minuti. E questo non è stato un attacco DoS.
sorin,

2
Sì, è un problema piuttosto interessante. Consiglio vivamente di mettere un PgBouncerdavanti all'istanza di PostgreSQL, metterà in coda le connessioni quando è troppo occupato invece di rifiutarle. (Sì, è stupido che PostgreSQL non possa farlo da solo, ma non è una soluzione semplice; vedi le discussioni infinite sulle mailing list relative al pooling incorporato).
Craig Ringer,

7
Che dire della registrazione delle connessioni (usando log_connections e log_disconnections) nel file di registro (ad es. Csvlog) e quindi usare pgBadger o qualcosa di simile per estrarlo dal file di registro?
a_horse_with_no_name

2
@a_horse_with_no_name Buon punto. Puoi persino "accodare" i log con un client che legge appena nuove voci di log, integrandosi con le disconnessioni e le connessioni per ottenere un rapporto quasi in tempo reale delle connessioni di picco durante un determinato periodo di tempo. Francamente, non dovrebbe essere così complicato. Uno dei miei compiti per il progetto AXLE ( axleproject.eu ) è implementare un po 'più di auditing, e potrei essere in grado di adattarlo a questo ...
Craig Ringer,

Risposte:


1

È meglio utilizzare strumenti di monitoraggio del carico di lavoro come pgbadgerper controllare le connessioni al database e il carico complessivo. Ti aiuterà a capire quali utenti si connettono per quanto tempo e quali query vengono attivate da loro. Per informazioni sull'installazione e la configurazione di pgbadger, consultare questa pagina.

Se vuoi solo controllare il numero di connessioni attive, puoi usare select count(*) from pg_stat_activity where state='active'


0

A tale scopo, puoi utilizzare l'estensione con local_preload_libraries.

Qualcosa come questo:

#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)
{
}

O invece AGGIORNA tramite NOTIFY


5
Per favore, prova a migliorare la tua risposta con alcune spiegazioni su come procedere.
McNets,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.