IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

27. Surveiller l'activité de la base de données

Un administrateur de bases de données se demande fréquemment : « Que fait le système en ce moment ? » Ce chapitre discute de la façon de le savoir.

Plusieurs outils sont disponibles pour surveiller l'activité de la base de données et pour analyser les performances. Une grande partie de ce chapitre concerne la description du récupérateur de statistiques de PostgreSQL™ mais personne ne devrait négliger les programmes de surveillance Unix standards tels que ps, top, iostat et vmstat. De plus, une fois qu'une requête peu performante a été identifiée, des investigations supplémentaires pourraient être nécessaires en utilisant la commande EXPLAIN(7) de PostgreSQL™. La Section 14.1, « Utiliser EXPLAIN » discute de EXPLAIN et des autres méthodes pour comprendre le comportement d'une seule requête.

27.1. Outils Unix standard

Sur la plupart des plateformes Unix, PostgreSQL™ modifie son titre de commande reporté par ps de façon à ce que les processus serveur individuels puissent être rapidement identifiés. Voici un affichage d'exemple :

$ ps auxww | grep ^postgres
postgres  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 postgres -i
postgres  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 postgres: writer process
postgres  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: checkpointer process
postgres  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: wal writer process
postgres  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 postgres: autovacuum launcher process
postgres  15558  0.0  0.0  17512  1068 ?        Ss   18:02   0:00 postgres: stats collector process
postgres  15582  0.0  0.0  58772  3080 ?        Ss   18:04   0:00 postgres: joe runbug 127.0.0.1 idle
postgres  15606  0.0  0.0  58772  3052 ?        Ss   18:07   0:00 postgres: tgl regression [local] SELECT waiting
postgres  15610  0.0  0.0  58772  3056 ?        Ss   18:07   0:00 postgres: tgl regression [local] idle in transaction

(L'appel approprié de ps varie suivant les différentes plateformes, de même que les détails affichés. Cet exemple est tiré d'un système Linux récent.) Le premier processus affiché ici est le processus serveur maître. Les arguments affichés pour cette commande sont les mêmes qu'à son lancement. Les cinq processus suivant sont des processus en tâche de fond lancés automatiquement par le processus maître (le processus « stats collector » n'est pas présent si vous avez configuré le système pour qu'il ne lance pas le récupérateur de statistiques ; de même que le processus « autovacuum launcher » peut être désactivé). Chacun des autres processus est un processus serveur gérant une connexion cliente. Tous ces processus restant initialisent l'affichage de la ligne de commande de la forme

postgres: utilisateur base_de_données hôte activité

L'utilisateur, la base de données et les éléments de l'hôte (client) restent identiques pendant toute la vie de connexion du client mais l'indicateur d'activité change. L'activité pourrait être idle (c'est-à-dire en attente d'une commande du client), idle in transaction (en attente du client à l'intérieur d'un bloc de BEGIN/COMMIT) ou un nom de commande du type SELECT. De plus, waiting est ajouté si le processus serveur est en attente d'un verrou détenu par une autre session. Dans l'exemple ci-dessus, nous pouvons supposer que le processus 15606 attend que le processus 15610 finisse sa transaction, et par conséquent libère un verrou (le processus 15610 doit être celui qui bloque car il n'y a aucune autre session active. Dans des cas plus compliqués, il serait nécessaire de regarder dans la vue système pg_locks pour déterminer qui est en train de bloquer qui.)

Si vous avez désactivé update_process_title, alors l'indicateur d'activité n'est pas mis à jour ; le titre du processus est configuré une seule fois quand un nouveau processus est lancé. Sur certaines plateformes, ceci permet d'économiser du temps. Sur d'autres, cette économie est insignifiante.

[Astuce]

Astuce

Solaris™ requiert une gestion particulière. Vous devez utiliser /usr/ucb/ps plutôt que /bin/ps. Vous devez aussi utiliser deux options w et non pas seulement une. En plus, votre appel original de la commande postgres doit avoir un affichage de statut dans ps plus petit que celui fourni par les autres processus serveur. Si vous échouez dans les trois, l'affichage de ps pour chaque processus serveur sera la ligne de commande originale de postgres.

27.1. Fonctions Statistiques

Une autre façon de regarder les statistiques peut être mise en place en écrivant des requêtes utilisant les mêmes fonctions d'accès sous- jacentes utilisées par les vues standards montrées au dessus. Pour des détails comme les noms de fonction, veuillez consulter les définitions de ces vues standards. (Par exemple, dans psql vous pouvez utiliser \d+ pg_stat_activity.) Les fonctions d'accès pour les statistiques par base de données prennent comme argument un OID pour identifier sur quelle base de données travailler. Les fonctions par table et par index utilisent un OID de table ou d'index. Les fonctions pour les statistiques par fonctions utilisent un OID de fonction. Notez que seuls les tables, index et fonctions dans la base de données courante peuvent être vus avec ces fonctions.

Les fonctions supplémentaires liées à la collecte de statistiques sont listées dans Tableau 27.13, « Fonctions supplémentaires de statistiques ».

Tableau 27.13. Fonctions supplémentaires de statistiques

Fonction Type renvoyé Description
pg_backend_pid() integer Identifiant du processus serveur gérant la session courante.
pg_stat_get_activity(integer) setof record Retourne un enregistrement d'informations sur le processus serveur du PID spécifié, ou un enregistrement pour chaque processus serveur actif dans le système si NULL est spécifié. Les champs retournés sont des sous-ensembles de ceux dans la vue pg_stat_activity.
pg_stat_clear_snapshot() void Supprime l'image statistique courante.
pg_stat_reset() void Remet à zéro tous les compteurs de statistique pour la base de données courante (nécessite les droits super-utilisateur).
pg_stat_reset_shared(text) void Remet à zéro quelques statistiques globales de l'instance, en fonction de l'argument (nécessite les droits super-utilisateur). Appeler pg_stat_reset_shared('bgwriter') réinitialisera tous les compteurs montrés dans la vue pg_stat_bgwriter.
pg_stat_reset_single_table_counters(oid) void Remet à zéro les statistiques pour une seule table ou index dans la base de données courante (nécessite les droits super-utilisateur).
pg_stat_reset_single_function_counters(oid) void Remet à zéro les statistiques pour une seule fonction dans la base de données courante (nécessite les droits super-utilisateur).

pg_stat_get_activity, la fonction sous-jacente de la vue pg_stat_activity, retourne un ensemble d'enregistrements contenant toute l'information disponible sur chaque processus serveur. Parfois il peut être plus pratique de n'obtenir qu'un sous-ensemble de cette information. Dans ces cas là, un ensemble plus vieux de fonctions d'accès aux statistiques par processus serveur peut être utilisé ; celle-ci sont montrées dans Tableau 27.14, « Fonctions statistiques par processus serveur ». Ces fonctions d'accès utilisent un numéro d'identifiant du processus serveur, qui va de un au nombre de processus serveurs actuellement actifs. La fonction pg_stat_get_backend_idset fournit une manière pratique de générer une ligne pour chaque processus serveur actif pour appeler ces fonctions. Par exemple, pour montrer les PID et requêtes en cours de tous les processus serveur :

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
       pg_stat_get_backend_activity(s.backendid) AS query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

Tableau 27.14. Fonctions statistiques par processus serveur

Fonction Type renvoyé Description
pg_stat_get_backend_idset() setof integer Ensemble de numéros de processus serveur actuellement actifs (de 1 jusqu'au nombre de processus serveur actifs)
pg_stat_get_backend_activity(integer) text Texte de la requête la plus récente de ce processus serveur
pg_stat_get_backend_activity_start(integer) timestamp with time zone Heure à laquelle la requête la plus récente a été démarrée
pg_stat_get_backend_client_addr(integer) inet Adresse IP du client connecté à ce processus serveur
pg_stat_get_backend_client_port(integer) integer Numéro de port TCP que le client utilise pour communiquer
pg_stat_get_backend_dbid(integer) oid OID de la base de données auquelle ce processus serveur est connecté
pg_stat_get_backend_pid(integer) integer Identifiant du processus serveur
pg_stat_get_backend_start(integer) timestamp with time zone Heure à lequelle ce processus a été démarré
pg_stat_get_backend_userid(integer) oid OID de l'utilisateur connecté à ce processus serveur
pg_stat_get_backend_waiting(integer) boolean Vrai si ce processus serveur est actuellement en attente d'un verrou
pg_stat_get_backend_xact_start(integer) timestamp with time zone Heure à laquelle la transaction courante a été démarrée