Est-il possible de surveiller les performances du serveur PostgreSQL à partir d'une fonction PL / PGSQL?

Aug 17 2020

Cela peut sembler exotique, car j'aimerais savoir par programme si c'est un «bon moment» pour exécuter une fonction PL / PGSQL à écriture lourde sur un serveur. Par «bon moment», je veux dire réfléchir à un indicateur direct ou calculé du niveau de charge, du niveau de concurrence ou de toute autre ampleur du serveur PostgreSQL.

Je sais qu'il existe un certain nombre d'applications avancées spécialisées dans le suivi des performances, comme https://www.datadoghq.com. Mais je veux juste un KPI interne simple qui modifie ou retarde l'exécution de ces procédures d'écriture lourde jusqu'à ce qu'un «meilleur moment» arrive.

Certaines de ces procédures purgent les tables, certaines font des calculs de moyenne / somme sur des millions de lignes, certaines vérifient les tables distantes, etc. Elles peuvent attendre des minutes ou des heures pour un «meilleur moment» lorsque la pression des utilisateurs simultanés diminue.

Une idée?

Réponses

3 jjanes Aug 16 2020 at 23:56

Vous pouvez voir combien d'autres sessions sont actives par quelque chose comme:

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

Mais vous devez être un superutilisateur, ou avoir le rôle pg_monitor, sinon l'état sera NULL pour les sessions d'autres utilisateurs. Si cela vous dérange, vous pouvez écrire une fonction avec SECURITY DEFINER pour autoriser l'accès à ces informations. (Vous devriez probablement le mettre dans sa propre fonction de toute façon, ce qui signifie qu'il n'y a aucune raison pour laquelle il doit être implémenté dans plpgsql à moins que ce ne soit le seul langage disponible pour vous.)

Vous pouvez également appeler toute opération arbitraire du système d'exploitation en utilisant un langage pl privilégié. Cela inclut de plpgsql , en abusant COPY...FROM PROGRAM.