Analyses et diagnostics

Module H2

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module H2
Titre Analyses et diagnostics
Révision 24.09
PDF https://dali.bo/h2_pdf
EPUB https://dali.bo/h2_epub
HTML https://dali.bo/h2_html
Slides https://dali.bo/h2_slides

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Analyses et diagnostics

PostgreSQL

Introduction

  • Deux types de supervision
    • occasionnelle
    • automatique
  • Superviser le matériel et le système
  • Superviser PostgreSQL et ses statistiques
  • Utiliser les bons outils
  • Supervision occasionnelle système
    • Linux
    • Windows
  • Supervision occasionnelle PostgreSQL
  • Outils

Supervision occasionnelle sous Unix

  • Nombreux outils
  • Les tester pour les sélectionner

Unix - ps

  • ps est l’outil de base pour les processus
  • Exemples
    • ps aux
    • ps f -f -u postgres

Unix - top

  • Principal intérêt : %CPU et %MEM
  • Intérêts secondaires
    • charge CPU
    • consommation mémoire
  • Autres outils
    • atop, htop

Unix - iotop

  • Principal intérêt : %IO
  • Accès root nécessaire

Unix - vmstat

  • Outil le plus fréquemment utilisé
  • Principal intérêt
    • lecture et écriture disque
    • iowait
  • Intérêts secondaires
    • nombre de processus en attente

Unix - iostat

  • Une ligne par partition
  • Intéressant pour connaître la partition la plus concernée par
    • les lectures
    • ou les écritures

Unix - sysstat

  • Outil le plus ancien
  • Récupère des statistiques de façon périodique
  • Permet de lire les statistiques datant de plusieurs heures, jours, etc.

Unix - free

  • Principal intérêt : connaître la répartition de la mémoire

Supervision occasionnelle sous Windows

  • Là aussi, nombreux outils
  • Les tester pour les sélectionner

Windows - tasklist

  • ps et grep en une commande

Windows - Process Monitor

  • Surveillance des processus
  • Filtres
  • Récupération de la ligne de commande, identificateur de session et utilisateur
  • Site officiel

Windows - Process Explorer

Windows - Outils Performances

  • Semblable à sysstat
  • Mais avec plus d’informations
  • Et des graphes immédiats

Surveiller l’activité de PostgreSQL

  • Plusieurs aspects à surveiller :
    • activité de la base
    • activité sur les tables
    • requêtes SQL
    • écritures

Vue pg_stat_database

  • Des informations globales à chaque base
  • Nombre de sessions
  • Nombre de transactions validées/annulées
  • Nombre d’accès blocs
  • Nombre d’accès enregistrements
  • Taille et nombre de fichiers temporaires
  • Erreurs de checksums
  • Temps d’entrées/sorties

Gérer les connexions

  • qui est connecté ?
  • qui fait quoi ?
  • qui est bloqué ?
  • qui bloque les autres ?
  • comment arrêter une requête ?

Vue pg_stat_activity

  • Liste des processus
    • sessions (backends)
    • processus en tâche de fond (10+)
  • Requête en cours/dernière exécutée
  • idle in transaction
  • Sessions en attente de verrou

Arrêter une requête ou une session

  • Annuler une requête
    • pg_cancel_backend (pid int)
    • pg_ctl kill INT pid (éviter)
    • kill -SIGINT pid, kill -2 pid (éviter)
  • Fermer une connexion
    • pg_terminate_backend(pid int, timeout bigint)
    • pg_ctl kill TERM pid (éviter)
    • kill -SIGTERM pid, kill -15 pid (éviter)
  • Jamais kill -9 ou kill -SIGKILL !!

pg_stat_ssl

Quand le SSL est activé sur le serveur, cette vue indique pour chaque connexion cliente les informations suivantes :

  • SSL activé ou non
  • Version SSL
  • Suite de chiffrement
  • Nombre de bits pour algorithme de chiffrement
  • Compression activée ou non
  • Distinguished Name (DN) du certificat client

Verrous

  • Visualisation des verrous en place
  • Tous types de verrous sur objets
  • Complexe à interpréter
    • verrous sur enregistrements pas directement visibles
    • voir l’article détaillé sur la base de connaissance Dalibo.

Trace des attentes de verrous

  • Message dans les traces
    • uniquement pour les attentes de plus d’une seconde
    • paramètre log_lock_waits à on
    • rapport pgBadger disponible

Trace des connexions

  • Message dans les traces
    • à chaque connexion/déconnexion
    • paramètre log_connections et log_disconnections
    • rapport pgBadger disponible

Surveiller l’activité sur les tables

  • Quelle taille font mes objets ?
  • Quel est leur taux de fragmentation ?
  • Comment sont-ils accédés ?

Obtenir la taille des objets

  • Pour une table :

    • pg_relation_size : heap
    • pg_table_size : + TOAST + divers
  • Index : pg_indexes_size

  • Table + index : pg_total_relation_size

  • Plus lisibles avec pg_size_pretty

Mesurer la fragmentation des objets

  • Fragmentation induite par MVCC
    • tables et index
  • Mesure précise de la fragmentation :
    • extension pgstattuple
  • Estimer la fragmentation :

Vue pg_stat_user_tables

  • Statistiques niveau «ligne»
  • Nombre de lignes insérées/mises à jour/supprimées
  • Type et nombre d’accès
  • Opérations de maintenance
  • Détection des tables mal indexées ou très accédées

Vue pg_stat_user_indexes

  • Vue par index
  • Nombre d’accès et efficacité

Vues pg_statio_user_tables & pg_statio_user_indexes

  • Opérations au niveau bloc
  • Demandés au système ou trouvés dans le cache de PostgreSQL
  • Pour calculer des hit ratios :
   idx_blks_hit::float / (idx_blks_read + idx_blks_hit)

Vue pg_stat_io

Vue synthétique des opérations disques selon :

  • le type de backend
    • backend, autovacuum, checkpointer…
  • le type d’objet
    • table ou table temporaire
  • le contexte
    • normal, vacuum, bulkread/bulkwrite…

Penser à activer track_io_timing

Surveiller l’activité SQL

  • Quelles sont les requêtes lentes ?
  • Quelles sont les requêtes les plus fréquentes ?
  • Quelles requêtes génèrent des fichiers temporaires ?
  • Quelles sont les requêtes bloquées ?
    • et par qui ?
  • Progression d’une requête

Trace des requêtes exécutées

  • log_min_duration_statements = <temps minimal d’exécution>
    • 0 permet de tracer toutes les requêtes
    • trace des paramètres
    • traces exploitables par des outils tiers
    • pas d’informations sur les accès, ni des plans d’exécution
  • log_min_duration_sample = <temps minimal d’exécution>
    • log_statement_sample_rate et/ou log_transaction_sample_rate
    • trace d’un ratio des requêtes
  • D’autres paramètres existent mais sont peu intéressants

Trace des fichiers temporaires

  • log_temp_files = <taille minimale>
    • 0 trace tous les fichiers temporaires
    • associe les requêtes SQL qui les génèrent
    • traces exploitable par des outils tiers

pg_stat_statements

  • Ajoute la vue statistique pg_stat_statements
  • Les requêtes sont normalisées
  • Indique les requêtes exécutées
    • avec la durée d’exécution, l’utilisation du cache, etc.

Vue pg_stat_statements - métriques 1/5

Métriques intéressantes :

  • Durée d’exécution :
    • total_exec_time
    • min_exec_time/max_exec_time
    • stddev_exec_time
    • mean_exec_time
  • Avant la version 13, les colonnes n’avaient pas _exec dans leur nom
  • Nombre de lignes retournées : rows

Vue pg_stat_statements - métriques 2/5

  • Durée d’optimisation (v13+) :
    • total_plan_time
    • min_plan_time/max_plan_time
    • stddev_plan_time
    • mean_plan_time

Vue pg_stat_statements - métriques 3/5

  • Accès à la mémoire partagée
    • shared_blks_hit/read/dirtied/written
  • Accès à la mémoire de la session (tables temporaires…)
    • local_blks_hit/read/dirtied/written
  • Lecture/écriture de fichiers temporaires
    • temp_blks_read/written
  • Temps d’accès en entrée/sortie
    • blk_read_time/blk_write_time

Vue pg_stat_statements - métriques 4/5

  • Journaux de transactions (v13+) :
    • wal_records
    • wal_fpi
    • wal_bytes

Vue pg_stat_statements - métriques 5/5

  • JIT (v15+)
    • jit_functions
    • jit_generation_time
    • etc

Requêtes bloquées

  • Vue pg_stat_activity
    • colonnes wait_event et wait_event_type
  • Vue pg_locks
    • colonne granted
    • colonne waitstart (v14+)
  • Fonction pg_blocking_pids

Progression d’une requête

  • API de progression de requêtes
  • Utilisé par les commandes SQL
    • VACUUM avec pg_stat_progress_vacuum
    • ANALYZE avec pg_stat_progress_analyze
    • CLUSTER et VACUUM FULL avec pg_stat_progress_cluster
    • CREATE INDEX et REINDEX avec pg_stat_progress_create_index
    • COPY avec pg_stat_progress_copy
  • Utilisé par la commande de réplication
    • BASE BACKUP avec pg_stat_progress_basebackup

Surveiller les écritures

  • Quelle quantité de données sont écrites ?
  • Quel canal d’écriture est utilisé ?

Trace des checkpoints

  • log_checkpoints = on
  • Affiche des informations à chaque checkpoint :
    • mode de déclenchement
    • volume de données écrits
    • durée du checkpoint
  • Trace exploitable par des outils tiers

Vue pg_stat_bgwriter

  • Activité des écritures dans les fichiers de données
  • Visualisation du volume d’allocations et d’écritures

Surveiller l’archivage et la réplication

  • Sauvegarde PITR & log shipping :
    • pg_stat_archiver
  • Réplication :
    • pg_stat_replication
    • pg_stat_database_conflicts

pg_stat_archiver

  • Bon fonctionnement de l’archivage
  • Quand et combien d’erreurs d’archivages se sont produites

pg_stat_replication & pg_stat_database_conflicts

  • pg_stat_replication :
    • État des serveurs secondaires (streaming)
    • Mesure du lag
  • pg_stat_database_conflicts :
    • nombre de conflits de réplication
    • par type

Outils d’analyse

  • Différents outils existent autour de PostgreSQL
  • Outils d’analyse occasionnel :
    • pg_activity
  • Outils d’analyse des traces :
    • pgBadger
  • Outils d’analyse des statistiques :
    • pgCluu, pg_stat_statements, PoWA

pg_activity

  • top pour PostgreSQL
  • Libre, script en python
  • Affiche :
    • les requêtes en cours
    • les sessions bloquées
    • les sessions bloquantes
  • Dépôt github

pgBadger

  • Script Perl
  • Traite les journaux applicatifs
  • Recherche des informations sur les requêtes
  • Génération d’un rapport HTML très détaillé
  • Site officiel

pgCluu

  • Outils de collectes de métriques de performances
  • Différents aspects mesurés :
    • informations sur le système
    • consommation des ressources CPU, RAM, I/O
    • utilisation de la base de données

PostgreSQL Workload Analyzer

  • Objectif : identifier les requêtes coûteuses
    • sans devoir accéder aux logs
    • quasi en temps-réel
  • Background worker
    • dépendant de pg_stat_statements
  • Site officiel

Conclusion

  • Un système est pérenne s’il est bien supervisé
  • Les systèmes de supervision automatique ont souvent besoin d’être complétés
  • PostgreSQL fourni énormément d’indicateurs utiles à la supervision
  • Les outils de supervision ponctuels sont utiles pour rapidement diagnostiquer l’état d’un serveur

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux Pratiques : analyse de traces avec pgBadger

Installation

Générer et étudier des rapports pgBadger

Travaux Pratiques : analyse de traces avec pgBadger (solution)

Travaux Pratiques : optimisation avec PoWA

Pré-requis : activité

Installation

Visualisation

Travaux Pratiques : optimisation avec PoWA (solution)

Travaux Pratiques : supervision avec temBoard

Installation de temBoard

Lancer de l’activité

Visualisation

Travaux Pratiques : supervision avec temBoard (solution)