25.2. Le récupérateur de statistiques
Le récupérateur de statistiques de
PostgreSQL™ est un
sous-système qui supporte la récupération et les rapports
d'informations sur l'activité du serveur. Actuellement, le
récupérateur peut compter les accès aux tables et index à la fois en
terme de blocs disque et de lignes individuelles.
PostgreSQL™ supporte aussi la
détermination de la commande exacte en cours d'exécution par les
autres processus serveur. Cette fonctionnalité indépendante peut être
activée ou désactivée que les statistiques niveau bloc et ligne
soient récupérées ou non.
25.2.1. Configuration de la récupération de statistiques
Comme la récupération de statistiques ajoute un temps
supplémentaire à l'exécution de la requête, le système peut être
configuré pour récupérer ou non des informations. Ceci est contrôlé
par les paramètres de configuration qui sont normalement
initialisés dans postgresql.conf (voir
Chapitre 17,
Configuration du serveur pour plus de détails sur leur
initialisation).
Le paramètre stats_start_collector
doit valoir true pour que le récupérateur
de statistiques soit seulement lancé. C'est la valeur par défaut et
la configuration recommandée mais elle peut être désactivée si vous
n'êtes pas intéressé par les statistiques et que vous souhaitez
supprimer toute activité en trop (néanmoins, ce que vous sauverez
sera assez restreint). Notez que cette option ne peut pas être
changée alors que le serveur est en cours d'exécution.
Les paramètres stats_block_level
et stats_row_level
contrôlent la quantité d'informations réellement envoyée au
récupérateur et détermine du coup le temps supplémentaire réclamé.
Ils déterminent respectivement si un processus serveur récupère les
statistiques d'accès disque au niveau bloc et celles au niveau
ligne. De plus, les statistiques sur les transactions réussies et
échouées par base sont récupérées si un de ces deux paramètres sont
configurés.
Le paramètre stats_command_string
active la surveillance de la commande en cours d'exécution par un
processus serveur. Le sous-processus de récupération des
statistiques n'a pas besoin d'être en cours d'exécution pour
activer cette fonctionnalité.
Normalement, ces paramètres sont configurés dans postgresql.conf de façon à ce qu'ils s'appliquent à
tous les processus serveur mais il est possible de les
activer/désactiver sur des sessions individuelles en utilisant la
commande SET
(pour empêcher les utilisateurs ordinaires de cacher leur activité
à l'administrateur, seuls les superutilisateurs sont autorisés à
modifier ces paramètres avec
SET
).
Note
Comme les paramètres stats_block_level
et stats_row_level valent par défaut
false, très peu de statistiques sont
récupérées dans la configuration par défaut. Activer une ou
plus des variables de configuration augmentera
significativement le nombre de données utiles produit par le
récupérateur de statistiques au prix d'une surcharge
supplémentaire à l'exécution.
25.2.2. Visualiser les statistiques récupérées
Plusieurs vues prédéfinies, listées dans le Tableau 25.1,
« Vues statistiques standards », sont disponibles
pour afficher les résultats de la récupération de statistiques.
Autrement, vous pouvez construire des vues personnalisées en
utilisant les fonctions statistiques existantes.
En utilisant les statistiques pour surveiller l'activité en cours,
il est important de réaliser que l'information n'est pas mise à
jour instantanément. Chaque processus serveur individuel transmet
le nouveau nombre d'accès au niveau des blocs et des lignes au
récupérateur juste avant l'attente d'une nouvelle commande du
client ; donc une requête toujours en cours n'affecte pas les
totaux affichés. De plus, le récupérateur lui-même émet un nouveau
rapport une fois par PGSTAT_STAT_INTERVAL
millisecondes (500, sauf si cette valeur a été modifiée lors de la
construction du serveur). Donc, les totaux affichés sont bien
derrière l'activité réelle. Néanmoins, l'information sur la requête
en cours récupérée par stats_command_string est toujours à jour.
Un autre point important est que, lorsqu'un processus serveur se
voit demander d'afficher une des statistiques, il récupère tout
d'abord le rapport le plus récent émis par le processus de
récupération, puis continue d'utiliser cette image de toutes les
vues et fonctions statistiques jusqu'à la fin de sa transaction en
cours. De façon similaire, les informations sur les requêtes en
cours, quelque soit le processus, sont récupérées quand une telle
information est demandée dans une transaction, et cette même
information sera affichée lors de la transaction. Donc, les
statistiques ne sembleront pas changer tant que vous restez dans la
même transaction. Ceci est une fonctionnalité, et non pas un bogue,
car il vous permet de traiter plusieurs requêtes sur les
statistiques et de corréler les résultats sans vous inquiéter que
les nombres aient pu changer. Mais si vous voulez voir les nouveaux
résultats pour chaque requête, assurez-vous de lancer les requêtes
en dehors de tout bloc de transaction.
Tableau 25.1. Vues statistiques standards
|
Nom de la vue
|
Description
|
|
pg_stat_activity
|
Une ligne par processus serveur, affichant l'OID de la
base de données, le nom de la base, l'ID du processus, l'OID de
l'utilisateur, son nom, la requête en cours, l'état
d'attente de la requête et le moment où a commencé
l'exécution de la requête, ainsi que l'adresse et le
numéro de port du client. Les colonnes renvoyant des
données sur la requête en cours sont disponibles sauf si
le paramètre stats_command_string a été désactivé. De
plus, ces colonnes sont seulement visibles si
l'utilisateur examinant cette vue est un superutilisateur
ou est le propriétaire du processus en cours de rapport.
|
|
pg_stat_database
|
Une ligne par base de données, affichant l'OID de la base
de données, son nom, le nombre de processus serveur
actifs connectés à cette base, le nombre total de
transactions validées et le nombre de celles qui ont été
annulées, le nombre total de blocs disque lus et le
nombre total de succès du tampon (c'est-à-dire le nombre
de lectures de blocs évitées en trouvant déjà le bloc
dans le cache du tampon).
|
|
pg_stat_all_tables
|
Pour chaque table dans la base de données en cours (ceci
incluant les tables TOAST), l'OID de la table, le nom du
schéma et de la table, le nombre de parcours séquentiels
réalisés, le nombre de lignes vivantes récupérées par des
parcours séquentiels, le nombre de lignes vivantes
récupérées par des parcours séquentiels, le nombre de
parcours d'index réalisés (pour tous les index
appartenant à cette table), le nombre de lignes vivantes
récupérées par les parcours d'index, le nombre
d'insertions, de modifications et de suppressions de
ligne, la dernière fois que la table a été la cible d'un
VACUUM manuel, la dernière fois qu'elle a été la cible
d'un VACUUM exécuté par le démon autovacuum, la dernière
fois que la table a été la cible d'un ANALYZE manuel, la
dernière fois qu'elle a été la cible d'un ANALYZE exécuté
par le démon autovacuum.
|
|
pg_stat_sys_tables
|
Identique à pg_stat_all_tables, sauf que seules
les tables systèmes sont affichées.
|
|
pg_stat_user_tables
|
Identique à pg_stat_all_tables, sauf que seules
les tables utilisateurs sont affichées.
|
|
pg_stat_all_indexes
|
Pour chaque index de la base de données en cours, l'OID
de la table et de l'index, le nom du schéma, de la table
et de l'index, le nombre de parcours d'index initiés sur
cet index, le nombre d'entrées de l'index renvoyées par
les parcours d'index, et le nombre de lignes actives de
table récupérées par de simples parcours d'index
utilisant cet index.
|
|
pg_stat_sys_indexes
|
Identique à pg_stat_all_indexes, sauf que seules
les tables systèmes sont affichées.
|
|
pg_stat_user_indexes
|
Identique à pg_stat_all_indexes, sauf que seules
les tables utilisateurs sont affichées.
|
|
pg_statio_all_tables
|
Pour chaque table de la base de données en cours (ceci
incluant les tables TOAST), l'OID de la table, le nom du
schéma et de la table, le nombre de blocs disque lus à
partir de cette table, le nombre de lectures tampon
réussies dans tous les index de cette table, le nombre de
blocs disque lus et de lectures tampon réussies à partir
de la table TOAST (si elle existe), et, enfin, le nombre
de blocs disque lus et le nombre de lectures tampon
réussies à partir de l'index de la table TOAST.
|
|
pg_statio_sys_tables
|
Identique à pg_statio_all_tables, sauf que seules
les tables systèmes sont affichées.
|
|
pg_statio_user_tables
|
Identique à pg_statio_all_tables, sauf que seules
les tables utilisateur sont affichées.
|
|
pg_statio_all_indexes
|
Pour chaque index de la base de données en cours, l'OID
de la table et de l'index, le nom du schéma, de la table
et de l'index, le nombre de blocs disque lus et le nombre
de lectures tampon réussies pour cet index.
|
|
pg_statio_sys_indexes
|
Identique à pg_statio_all_indexes, sauf que seuls
les index systèmes sont affichés.
|
|
pg_statio_user_indexes
|
Identique à pg_statio_all_indexes, sauf que seuls
les index utilisateur sont affichés.
|
|
pg_statio_all_sequences
|
Pour chaque séquence de la base de données en cours,
l'OID de la séquence, le nom du schéma et de la séquence,
le nombre de blocs disque lus et le nombre de lectures
réussies du tampon pour cette séquence.
|
|
pg_statio_sys_sequences
|
Identique à pg_statio_all_sequences, sauf que
seules les séquences système sont affichées
(actuellement, aucune séquence système n'est définie,
donc cette vue est toujours vide)
|
|
pg_statio_user_sequences
|
Identique à pg_statio_all_sequences, sauf que
seules les séquences utilisateur sont affichées.
|
Les statistiques par index sont particulièrement utiles pour
déterminer les index utilisés et leur efficacité.
À partir de la version 8.1 de PostgreSQL™, les index peuvent être
utilisés soit directement soit via des « parcours de bitmap ». Dans un parcours de
bitmap, les résultats de plusieurs index peuvent être combinés via
des règles AND ou OR ; donc il est difficile d'associer des
récupérations de lignes d'en-têtes individuelles avec des index
spécifiques quand un parcours de bitmap est utilisé. Du coup, un
parcours de bitmap incrémente le nombre dans pg_stat_all_indexes.
idx_tup_read
pour les index qu'il
utilise et il incrémente le nombre pg_stat_all_tables.
idx_tup_fetch
pour la table, mais il
n'affecte pas pg_stat_all_indexes.
idx_tup_fetch
.
Note
Avant PostgreSQL™ 8.1,
les totaux
idx_tup_read
et
idx_tup_fetch
étaient
pratiquement toujours égaux. Maintenant, ils peuvent être
différents même sans considérer les parcours de bitmap parce
que
idx_tup_read
compte
les entrées d'index récupérées à partir de l'index alors que
idx_tup_fetch
compte les
lignes actives récupérées à partir de la table ; ce dernier
sera moindre si des lignes mortes ou pas-encore-validées sont
récupérées en utilisant l'index.
Les vues pg_statio_ sont
principalement utiles pour déterminer l'efficacité du cache tampon.
Quand le nombre de lectures disques réelles est plus petit que le
nombre de récupérations valides par le tampon, alors le cache
satisfait la plupart des demandes de lecture sans faire appel au
noyau. Néanmoins, ces statistiques ne nous donnent pas l'histoire
complète : à cause de la façon dont PostgreSQL™ gère les entrées/sorties
disque, les données qui ne sont pas dans le tampon de PostgreSQL™ pourraient toujours résider
dans le tampon d'entrées/sorties du noyau et pourraient, du coup,
être toujours récupérées sans nécessiter une lecture physique. Les
utilisateurs intéressés pour obtenir des informations plus
détaillées sur le comportement des entrées/sorties dans
PostgreSQL™ sont invités à
utiliser le récupérateur de statistiques de PostgreSQL™ avec les outils du système
d'exploitation permettant une vue de la gestion des entrées/sorties
par le noyau.
Il existe d'autres façons de regarder les statistiques. Cela se
fait en écrivant des requêtes qui utilisent les mêmes fonctions
d'accès aux statistiques que les vues standards. Ces fonctions sont
listées dans le Tableau 25.2,
« Fonctions d'accès aux statistiques ». Les fonctions
d'accès par base de données prennent un OID de la base de données
comme argument pour identifier la base de données du rapport. Les
fonctions par table et par index prennent l'OID de la table ou de
l'index (notez que seuls les tables et les index de la base de
données en cours peuvent être vus par ces fonctions). Les fonctions
d'accès au processus prennent le numéro d'identifiant du processus.
Tableau 25.2. Fonctions d'accès aux statistiques
|
Fonction
|
Code de retour
|
Description
|
|
pg_stat_get_db_numbackends(oid)
|
integer
|
Nombre de processus actifs pour la base de données
|
|
pg_stat_get_db_xact_commit(oid)
|
bigint
|
Transactions validées dans la base de données
|
|
pg_stat_get_db_xact_rollback(oid)
|
bigint
|
Transactions annulées dans la base de données
|
|
pg_stat_get_db_blocks_fetched(oid)
|
bigint
|
Nombre de demandes de récupérations de blocs disque pour
la base de données
|
|
pg_stat_get_db_blocks_hit(oid)
|
bigint
|
Nombre de demandes de récupérations de blocs disque
trouvés dans le tampon pour la base de données
|
|
pg_stat_get_numscans(oid)
|
bigint
|
Nombre de parcours séquentiels réalisés lorsque
l'argument est une table, ou nombre de parcours d'index
lorsque l'argument est un index
|
|
pg_stat_get_tuples_returned(oid)
|
bigint
|
Nombre de lignes lues par les parcours séquentiels
lorsque l'argument est une table, ou nombre de lignes
d'index lues lorsque l'argument est un index
|
|
pg_stat_get_tuples_fetched(oid)
|
bigint
|
Le nombre de lignes de table récupérées par des parcours
de bitmap quand l'argument est une table, ou les lignes
de table récupérées par de simples parcours d'index en
utilisant cet index quand l'argument est un index.
|
|
pg_stat_get_tuples_inserted(oid)
|
bigint
|
Nombre de lignes insérées dans la table
|
|
pg_stat_get_tuples_updated(oid)
|
bigint
|
Nombre de lignes mises à jour dans la table
|
|
pg_stat_get_tuples_deleted(oid)
|
bigint
|
Nombre de lignes supprimées dans la table
|
|
pg_stat_get_blocks_fetched(oid)
|
bigint
|
Nombre de demandes de récupération de blocs disques pour
la table ou l'index
|
|
pg_stat_get_blocks_hit(oid)
|
bigint
|
Nombre de demandes de blocs disque récupérés dans le
tampon pour la table ou l'index
|
|
pg_stat_get_tuples_deleted(oid)
|
bigint
|
Nombre de lignes supprimées dans la table
|
|
pg_stat_get_blocks_fetched(oid)
|
bigint
|
Nombre de requêtes de récupération de blocs disque pour
les tables ou index
|
|
pg_stat_get_blocks_hit(oid)
|
bigint
|
Nombre de requêtes de blocs disque trouvés en cache pour
les tables ou index
|
|
pg_stat_get_last_vacuum_time(oid)
|
timestamptz
|
Date/heure du dernier VACUUM survenu sur cette table à la
demande de l'utilisateur
|
|
pg_stat_get_last_autovacuum_time(oid)
|
timestamptz
|
Date/heure du dernier ANALYZE lancé par le démon
autovacuum survenu sur cette table.
|
|
pg_stat_get_last_analyze_time(oid)
|
timestamptz
|
Date/heure du dernier VACUUM survenu sur cette table à la
demande de l'utilisateur
|
|
pg_stat_get_last_autoanalyze_time(oid)
|
timestamptz
|
Date/heure du dernier ANALYZE lancé par le démon
autovacuum survenu sur cette table.
|
|
pg_stat_get_backend_idset()
|
set of integer
|
Ensemble d'identifiants de processus actifs (de 1 au
nombre de processus actifs). Voir l'exemple d'utilisation
dans le texte.
|
|
pg_backend_pid()
|
integer
|
ID du processus pour le processus serveur attaché à la
session en cours
|
|
pg_stat_get_backend_pid(integer)
|
integer
|
ID du processus pour le processus serveur donné
|
|
pg_stat_get_backend_dbid(integer)
|
oid
|
ID de la base de données pour le processus serveur en
cours
|
|
pg_stat_get_backend_userid(integer)
|
oid
|
ID de l'utilisateur pour le processus serveur en cours
|
|
pg_stat_get_backend_activity(integer)
|
text
|
Commande active du processus serveur indiqué mais
seulement si l'utilisateur courant est un
superutilisateur ou le même utilisateur dont vient la
commande (et que stats_command_string est activé)
|
|
pg_stat_get_backend_waiting(integer)
|
boolean
|
True si le processus serveur indiqué attend un verrou
mais seulement si l'utilisateur courant est un
superutilisateur ou le même utilisateur dont vient la
commande (et que stats_command_string est activé)
|
|
pg_stat_get_backend_activity_start(integer)
|
timestamp with time zone
|
Date/heure du lancement de la requête en cours
d'exécution sur le processus serveur indiqué, mais
seulement si l'utilisateur courant est un
superutilisateur ou le même utilisateur dont vient la
commande (et que stats_command_string est activé)
|
|
pg_stat_get_backend_start(integer)
|
timestamp with time zone
|
L'heure à laquelle le processus serveur donné a été lancé
ou NULL si l'utilisateur en cours n'est ni un
superutilisateur ni l'utilisateur de la session requêtée
|
|
pg_stat_get_backend_client_addr(integer)
|
inet
|
L'adresse IP du client connecté au processus serveur
donné. NULL si la connexion est établie sur un socket de
domaine Unix. Aussi NULL si l'utilisateur en cours n'est
ni un superutilisateur ni l'utilisateur de la session
requêtée
|
|
pg_stat_get_backend_client_port(integer)
|
integer
|
Le numéro de port du client connecté au processus serveur
donné. -1 si la connexion est établie sur un socket de
domaine Unix. NULL si l'utilisateur en cours n'est ni un
superutilisateur ni l'utilisateur de la session requêtée
|
|
pg_stat_reset()
|
boolean
|
Réinitialise les statistiques niveau bloc et niveau ligne
à zéro
|
Note
blocks_fetched moins blocks_hit donne le nombre d'appels lancés pour
la table, l'index ou la base de données ; mais le nombre réel
de lectures physiques est habituellement moindre à cause des
tampons du noyau.
La fonction pg_stat_get_backend_idset
fournit un moyen agréable de générer une ligne pour chaque
processus serveur actif. Par exemple, pour afficher les
PID et les requêtes en cours
pour tous les processus serveur :
SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
pg_stat_get_backend_activity(s.backendid) AS current_query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
|