È possibile monitorare le prestazioni del server PostgreSQL dall'interno di una funzione PL / PGSQL?

Aug 17 2020

Questo può sembrare esotico, poiché vorrei sapere a livello di programmazione se è un "buon momento" per eseguire una funzione PL / PGSQL a scrittura pesante in un server. Con "buon momento" intendo riflettere su qualche indicatore diretto o calcolato del livello di carico, del livello di concorrenza o di qualsiasi altra grandezza del server PostgreSQL.

Sono consapevole che esistono numerose applicazioni avanzate specializzate nel monitoraggio delle prestazioni, come https://www.datadoghq.com. Ma voglio solo un semplice KPI interno che alteri o ritardi l'esecuzione di queste procedure di scrittura pesante fino a quando non arriva un "momento migliore".

Alcune di queste procedure eliminano le tabelle, altre eseguono calcoli di media / somma su milioni di righe, altre controllano tabelle remote, ecc. Possono attendere minuti o ore per un "momento migliore" quando la pressione dell'utente simultaneo diminuisce.

Qualche idea?

Risposte

3 jjanes Aug 16 2020 at 23:56

Puoi vedere quante altre sessioni sono attive da qualcosa come:

select count(*) from pg_stat_activity where state='active';

Ma devi essere un superutente, o avere il ruolo pg_monitor, altrimenti lo stato sarà NULL per le sessioni di altri utenti. Se questo ti infastidisce, potresti scrivere una funzione con SECURITY DEFINER per consentire l'accesso a queste informazioni. (Probabilmente dovresti comunque metterlo nella sua funzione, il che significa che non c'è motivo per cui debba essere implementato in plpgsql a meno che non sia l'unico linguaggio a tua disposizione.)

È inoltre possibile richiamare qualsiasi operazione arbitraria del sistema operativo utilizzando un linguaggio pl adeguatamente privilegiato. Ciò include da plpgsql , abusando COPY...FROM PROGRAM.