Dalibo & Contributors
Photographie de Rad Dougall, licence CC BY 3.0, obtenue sur wikimedia.org.
La supervision est la surveillance du bon fonctionnement d’un système ou d’une activité.
Elle permet de surveiller, rapporter et alerter les fonctionnements normaux et anormaux des systèmes informatiques.
Elle répond aux préoccupations suivantes :
Superviser un serveur de bases de données consiste à superviser le SGBD lui-même mais aussi le système d’exploitation et le matériel. Ces deux derniers sont importants pour connaître la charge système, l’utilisation des disques ou du réseau, qui pourraient expliquer des lenteurs au niveau du SGBD. PostgreSQL propose lui aussi des informations qu’il est important de surveiller pour détecter des problèmes au niveau de l’utilisation du SGBD ou de sa configuration.
Un système de supervision automatique est primordial. Il permet de toujours être notifié en cas de dysfonctionnement. Couplé à un outil de visualisation graphique, il fournit un aperçu de l’évolution du système dans le temps.
Il peut également être intéressant, en cas de fonctionnement anormal, ou pour un besoin d’audit, de venir ponctuellement superviser un système en utilisant un outil précis.
Il n’existe pas qu’une seule supervision. Suivant la personne concernée par la supervision, son objectif, les critères de la supervision seront différents.
Lors de la mise en place de la supervision, il est important de se demander l’objectif de cette supervision, à qui elle va servir, les critères qui importent à cette personne.
Répondre à ces questions permettra de mieux choisir l’outil de supervision à mettre en place, ainsi que sa configuration.
Généralement, les administrateurs mettant en place la supervision veulent pouvoir anticiper les problèmes qu’ils soient matériels, de performance, de qualité de service, etc.
Améliorer les performances du SGBD sans connaître les performances globales du système est très difficile. Si un utilisateur se plaint d’une perte de performance, pouvoir corroborer ses dires avec des informations provenant du système de supervision aide à s’assurer qu’il y a bien un problème de performances et peut fréquemment aider à résoudre le problème. De plus, il est important de pouvoir mesurer les gains obtenus après une modification matérielle ou logicielle.
Une supervision des traces de PostgreSQL permet aussi d’améliorer les applications qui utilisent une base de données. Toute requête en erreur est tracée dans les journaux applicatifs, ce qui permet de trouver rapidement les problèmes que les utilisateurs rencontrent.
Un suivi régulier de la volumétrie ou du nombre de connexions permet de prévoir les évolutions nécessaires du matériel ou de la configuration : achat de matériel, création d’index, amélioration de la configuration.
Prévenir les incidents peut se faire en ayant une sonde de supervision des erreurs disques par exemple. La supervision permet aussi d’anticiper les problèmes de configuration. Par exemple, surveiller le nombre de sessions ouvertes sur PostgreSQL permet de s’assurer que ce nombre n’approche pas trop du nombre maximum de sessions configuré avec le paramètre max_connections
dans le fichier postgresql.conf
.
Enfin, une bonne configuration de la supervision implique d’avoir configuré finement la gestion des traces de PostgreSQL. Avoir un bon niveau de trace (autrement dit ni trop ni pas assez) permet de réagir rapidement après un crash.
Il y a trois types d’acteurs concernés par la supervision.
Le développeur doit pouvoir visualiser l’activité de la base de données. Il peut ainsi comprendre l’impact du code applicatif sur la base. De plus, le développeur est intéressé par la qualité des requêtes que son code exécute. Donc des traces qui ramènent les requêtes en erreur et celles qui ne sont pas performantes sont essentielles pour ce profil.
L’administrateur de bases de données a besoin de surveiller les bases pour s’assurer de la qualité de service, pour garantir les performances et pour réagir rapidement en cas de problème. Il doit aussi faire les mises à jours mineures dès qu’elles sont disponibles.
Enfin, l’administrateur système doit s’assurer de la présence du service. Il doit aussi s’assurer que le service dispose des ressources nécessaires, en terme de processeur (donc de puissance de calcul), de mémoire et de disque (notamment pour la place disponible).
Voici quelques exemples d’indicateurs intéressants à superviser pour la partie du système d’exploitation.
La charge CPU (processeur) est importante. Elle peut expliquer pourquoi des requêtes, auparavant rapides, deviennent lentes. Cependant, la suractivité comme la non-activité sont un problème. En fait, si le service est tombé, le serveur sera en sous-activité, ce qui est un excellent indice.
Les entrées/sorties disque permettent de montrer un souci au niveau du système disque : soit PostgreSQL écrit trop à cause d’une mauvaise configuration des journaux de transactions, soit les requêtes exécutées utilisent des fichiers temporaires pour trier les données, ou pour une toute autre raison.
L’espace disque est essentiel à surveiller. PostgreSQL ne propose rien pour cela, il faut donc le faire au niveau système. L’espace disque peut poser problème s’il manque, surtout si cela concerne la partition des journaux de transactions.
Il est possible aussi d’utiliser une requête étalon dont la durée d’exécution sera testée de temps à autre pour détecter les moments problématiques sur le serveur.
Il existe de nombreux indicateurs intéressants sur les bases :
PostgreSQL propose deux canaux d’informations :
PostgreSQL stocke un ensemble d’informations dans des tables systèmes. Il peut s’agir de métadonnées des schémas, d’informations sur les tables et les colonnes, de données de suivi interne, etc. PostgreSQL fournit également des vues combinant des informations puisées dans différentes tables systèmes. Ces vues simplifient le suivi de l’activité de la base.
PostgreSQL est aussi capable de tracer un grand nombre d’informations qui peuvent être exploitées pour surveiller l’activité de la base de données.
Pour pouvoir mettre en place un système de supervision automatique, il est essentiel de s’assurer que les statistiques d’activité et les traces applicatives sont bien configurées et il faut aussi leur associer un outil permettant de sauvegarder les données, les alertes et de les historiser.
Pour récupérer et enregistrer les informations statistiques, les historiser, envoyer des alertes ou dessiner des graphiques, il faut faire appel à un outil externe.
Cela peut être fait grâce à des outils de supervision génériques comme Icinga, munin ou Zabbix. On utilisera des agents ou plugins spécifiques pour ces outils comme pg-monz, check_pgactivity ou check_postgres.
Nous nous intéresserons durant ce workshop à des outils graphiques spécifiques pour PostgreSQL.
Il existe de nombreux programmes qui analysent les traces. On peut distinguer deux catégories :
L’analyse en temps réel d’une instance permet de réagir rapidement en cas de problème. Par exemple, il est important d’avoir une réaction rapide en cas de manque d’espace disque, ou bien de pouvoir comprendre les raisons de requêtes trop lentes. Dans cette catégorie, nous discuterons de deux outils : PoWA et temboard.
L’analyse après coup permet une analyse plus fine, se terminant généralement par un rapport, fréquemment en HTML, parfois avec des graphes. Cette analyse plus fine nécessite des outils spécialisés. Nous étudierons le logiciel pgBagder.
pgBadger est un script Perl écrit par Gilles Darold. Il s’utilise en ligne de commande : il suffit de lui fournir le ou les fichiers de traces à analyser et il rend un rapport HTML sur les requêtes exécutées, sur les connexions, sur les bases, etc. Le rapport est très complet, il peut contenir des graphes zoomables.
C’est certainement le meilleur outil actuel de rétro-analyse d’un fichier de traces PostgreSQL.
Le site web de pgBadger se trouve sur https://pgbadger.darold.net/
Il est essentiel de bien configurer PostgreSQL pour que les traces ne soient pas en même temps trop nombreuses pour ne pas être submergées par les informations et trop peu pour ne pas savoir ce qu’il se passe. Un bon dosage du niveau des traces est important. Savoir où envoyer les traces est tout aussi important.
Les traces sont enregistrées dans la locale par défaut du serveur. Avoir des traces en français peut présenter certains intérêts pour les débutants mais cela présente plusieurs gros inconvénients. Chercher sur un moteur de recherche avec des traces en français donnera beaucoup moins de résultats qu’avec des traces en anglais.
De plus, les outils d’analyse automatique des traces se basent principalement sur des traces en anglais. Donc, il est vraiment préférable d’avoir les traces en anglais. Cela peut se faire ainsi :
lc_messages = 'C'
Lorsque la destination des traces est syslog
ou eventlog
, elles se voient automatiquement ajouter quelques informations dont un horodatage, essentiel. Lorsque la destination est stderr
, ce n’est pas le cas. Par défaut, l’utilisateur se retrouve avec des traces sans horodatage, autrement dit des traces inutilisables. PostgreSQL propose donc le paramètre log_line_prefix
qui permet d’ajouter un préfixe à une trace.
Ce préfixe peut contenir un grand nombre d’informations, comme un horodatage, le PID du processus serveur, le nom de l’application cliente, le nom de l’utilisateur, le nom de la base. Un paramétrage possible est le suivant :
log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '
En dehors des erreurs et des durées des requêtes, il est aussi possible de tracer certaines activités ou comportements.
Quand on souhaite avoir une trace de qui se connecte, il est intéressant de pouvoir tracer les connexions et, parfois aussi, les déconnexions. En activant les paramètres log_connections
et log_disconnections
, nous obtenons les heures de connexions, de déconnexions et la durée de la session.
log_autovacuum_min_duration
correspond à log_min_duration_statement
, mais pour l’autovacuum. Son but est de tracer l’activité de l’autovacuum si son exécution demande plus d’un certain temps.
log_checkpoints
permet de tracer l’activité des checkpoints. Cela ajoute un message dans les traces pour indiquer qu’un checkpoint commence et une autre quand il termine. Cette deuxième trace est l’occasion d’ajouter des statistiques sur le travail du checkpoint :
2016-09-01 13:34:17 CEST LOG: checkpoint starting: xlog
2016-09-01 13:34:20 CEST LOG: checkpoint complete: wrote 13115 buffers (80.0%);
0 transaction log file(s) added, 0 removed,
0 recycled; write=3.007 s, sync=0.324 s,
total=3.400 s; sync files=16,
longest=0.285 s,
average=0.020 s; distance=404207 kB,
estimate=404207 kB
Le message indique donc en plus le nombre de blocs écrits sur disque, le nombre de journaux de transactions ajoutés, supprimés et recyclés. Il est rare que des journaux soient ajoutés, ils sont plutôt recyclés. Des journaux sont supprimés quand il y a eu une très grosse activité qui a généré plus de journaux que d’habitude. Les statistiques incluent aussi la durée des écritures, de la synchronisation sur disque, la durée totale, etc.
Le paramètre log_lock_waits
permet de tracer une attente trop importante de verrous. En fait, quand un verrou est en attente, un chronomètre est déclenché. Lorsque l’attente dépasse la durée indiquée par le paramètre deadlock_timeout
, un message est enregistré, comme dans cet exemple :
2016-09-01 13:38:40 CEST LOG: process 15976 still waiting for
AccessExclusiveLock on relation 26160 of
database 16384 after 1000.123 ms
2016-09-01 13:38:40 CEST STATEMENT: DROP TABLE t1;
Plus ce type de message apparaît dans les traces, plus des contentions ont lieu sur le serveur, ce qui peut diminuer fortement les performances.
Le paramètre log_temp_files
permet de tracer toute création de fichiers temporaires, comme ici :
2016-09-01 13:41:11 CEST LOG: temporary file: path
"base/pgsql_tmp/pgsql_tmp15617.1",
size 59645952
Tout fichier temporaire demande des écritures disques.
Ces écritures peuvent poser problème pour les performances globales du système. Il est donc important de savoir si des fichiers temporaires sont créés ainsi que leur taille.
Le paramètre log_min_duration_statement
, trace toute requête dont la durée d’exécution dépasse la valeur du paramètre (l’unité est la milliseconde). Il trace aussi la durée d’exécution des requêtes tracées. Par exemple, avec une valeur de 500, toute requête dont la durée d’exécution dépasse 500 ms sera tracée. À 0, toutes les requêtes se voient tracées. Pour désactiver la trace, il suffit de mettre la valeur -1 (qui est la valeur par défaut).
Suivant la charge que le système va subir à cause des traces, il est possible de configurer finement la durée à partir de laquelle une requête est tracée. Cependant, il faut bien comprendre que plus la durée est importante, plus la vision des performances est partielle. Il est parfois plus intéressant de mettre 0 ou une très petite valeur sur une petite durée, qu’une grosse valeur sur une grosse durée. Cela étant dit, laisser 0 en permanence n’est pas recommandé. Il est préférable de configurer ce paramètre à une valeur plus importante en temps normal pour détecter seulement les requêtes les plus longues et, lorsqu’un audit de la plateforme est nécessaire, passer temporairement ce paramètre à une valeur très basse (0 étant le mieux).
La trace fournie par log_min_duration_statement
ressemble à ceci :
2018-09-01 17:34:03 CEST LOG: duration: 136.811 ms statement: insert into t1
values (2000000,'test');
La façon la plus simple pour créer un rapport pgBadger est de simplement indiquer au script le fichier de traces de PostgreSQL à analyser.
Il existe énormément d’options. L’aide fournie sur le site web officiel les cite intégralement. Il serait difficile de les citer ici, des options étant ajoutées très fréquemment.
A noter un mode de fonctionnement incrémental. Combiné au format binaire, il permet de parser régulièrement les fichiers de traces applicatives de PostgreSQL. Puis, de générer des rapports HTML à la demande.
On peut ainsi créer un fichier chaque heure :
pgbadger --last-parsed .pgbadger_last_state -o YY_MM_DD_HH.bin postgresql.log
On pourra créer un rapport en précisant les fichiers binaires voulus :
pgbadger -o rapport_2018_11_05.html 2018_11_05_**.bin
PoWA (PostgreSQL Workload Analyzer) est un outil communautaire, sous licence PostgreSQL.
L’outil récupére à intervalle régulier les statistiques collectées par diverses extensions, les stocke et les historise.
L’outil fournit également une interface graphique permettant d’exploiter ces données. On pourra observer en temps réel l’activité de l’instance. Cette activité est présentée sous forme de graphiques interactifs et de tableaux présentant les requêtes normalisées. Ces tableaux peuvent être triés selon divers critères sur un intervalle de temps sélectionné.
PoWA permet d’afficher de nombreuses informations qui manquent cruellement à l’écosystème PostgreSQL, par exemple :
Il est aussi capable de suggérer la création d’index pertinents.
Et tout cela en temps réel.
La collecte des informations et métriques de PoWA sont fournis par des extensions de PostgreSQL. Leur mise en place nécessite le préchargement de bibliothèques dans la mémoire partagée grâce au paramètre shared_preload_libraries
dans le fichier postgresql.conf. Leur activation nécessite le redémarrage de l’instance.
pg_stat_statements
est une extension officielle de PostgreSQL. Elle est disponible dans les modules contrib. Elle permet de récupérer de nombreuses métriques par requête normalisée, utilisateur et base de données. Ces données sont par exemple le nombre d’appels, le temps moyen, le nombre de blocs lus dans le cache de PostgreSQL pour chaque requête normalisée.
pg_stat_kcache
est une extension développée pour PoWA. Elle fournit des indicateurs complémentaires à ceux de pg_stat_statements
, mais côté système. On a donc a disposition par requête, utilisateur et base de données l’utilisation du processeur, ainsi que les accès physiques aux disques.
pg_qualstats
est une extension développée pour PoWA. Elle fournit de nombreuses informations très pertinentes concernant les prédicats des requêtes exécutées sur une instance, comme la sélectivité d’un prédicat, les valeurs utilisées, etc.
pg_wait_sampling
est une extension qui échantillonne à une fréquence elevée les wait_event
. PoWA repose sur cette extension pour collecter les données et les historiser.
pg_sortstats
est une extension développée pour PoWA. Elle récupère des statistiques sur les tris et permet d’estimer la quantité de mémoire work_mem
nécessaire pour effectuer un tri en mémoire et non sur disque. Voir la section consacrée à ce paramètre dans le chapitre sur l’optimisation de la formation DBA4 - PostgreSQL Performances pour plus d’information.
Cette extension est en phase de développement et ne doit pas être utilisée en production. Vous êtes encouragés à la tester et à faire des retours aux développeurs du projet.
Plus d’information dans les documentations :