Les Wait Events dans PostgreSQL
Introduction
Les wait events dans PostgreSQL jouent un rôle crucial dans la performance des bases de données. Ces événements représentent des moments où un processus PostgreSQL est en attente de certaines ressources pour continuer à fonctionner, qu’il s’agisse de verrous, d’entrées/sorties disque, de réseau ou d’autres facteurs. Comprendre ces événements permet d’identifier les goulets d’étranglement potentiels et d’optimiser les performances de votre base de données.
Dans cet article, nous allons explorer les différents types de wait events que l’on peut rencontrer dans PostgreSQL, apprendre à les détecter et à les analyser, ainsi que découvrir les bonnes pratiques en matière de paramétrage pour éviter ou minimiser ces attentes.
1. Qu’est-ce qu’un Wait Event dans PostgreSQL ?
Un wait event se produit lorsqu’un processus PostgreSQL attend une ressource spécifique avant de poursuivre son exécution. Ces ressources peuvent inclure des accès à des fichiers, des verrous sur les lignes de la base de données, ou encore l’accès à la mémoire. La collecte de ces événements est primordiale pour le diagnostic des problèmes de performance.
Les wait events sont enregistrés pour chaque processus actif dans PostgreSQL, et peuvent être utilisés pour analyser l’état des systèmes sous charge.
2. Types de Wait Events dans PostgreSQL
Les wait events dans PostgreSQL peuvent être regroupés en plusieurs catégories selon la nature de l’attente :
a) Lock Waits
Les verrous sont utilisés pour garantir l’intégrité des données dans les bases de données concurrentes. Les Lock Waits se produisent lorsqu’un processus attend qu’un autre processus libère un verrou.
- Exemple d’événements :
Lock: transactionid
,Lock: relation
,Lock: extend
b) I/O Waits (Entrées/Sorties)
Ces événements indiquent que PostgreSQL attend la lecture ou l’écriture de données sur le disque.
- Exemple d’événements :
IO: DataFileRead
,IO: DataFileWrite
,IO: WALWrite
c) Network Waits
Ces événements concernent les processus en attente de données en provenance d’une connexion réseau.
- Exemple d’événements :
ClientRead
,ClientWrite
d) Buffer Pin Waits
PostgreSQL utilise des buffers pour minimiser l’accès disque. Les Buffer Pin Waits se produisent lorsque plusieurs processus veulent accéder simultanément au même buffer en mémoire.
- Exemple d’événements :
BufferPin: content_lock
,BufferPin: io_in_progress
e) LWLock Waits (Lightweight Locks)
Les LWLocks sont des verrous légers utilisés pour protéger les structures internes de PostgreSQL telles que les caches ou les métadonnées.
- Exemple d’événements :
LWLock: buffer_mapping
,LWLock: wal_insert_lock
f) Extension Waits
Ces événements sont liés à l’extension des fichiers de la base de données lorsqu’ils atteignent leur taille maximale.
- Exemple d’événements :
RelationExtension
,WALWrite
g) Timeout Waits
Ces événements indiquent que PostgreSQL attend l’expiration d’une certaine période avant de reprendre certaines opérations.
- Exemple d’événements :
IdleInTransactionSessionTimeout
,LockTimeout
3. Détection des Wait Events
PostgreSQL fournit plusieurs moyens pour détecter et analyser les wait events :
a) Utilisation de la vue pg_stat_activity
La vue pg_stat_activity donne des informations sur l’activité actuelle des processus dans PostgreSQL, y compris les wait events.
SELECT pid, usename, application_name, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE wait_event IS NOT NULL;
- wait_event_type : indique la catégorie de l’attente (comme
Lock
,IO
, etc.). - wait_event : le type spécifique de l’attente.
b) Utilisation de la vue pg_stat_io
Cette vue est utile pour comprendre les I/O waits sur le disque.
SELECT * FROM pg_stat_io;
Elle donne des informations détaillées sur les opérations de lecture et d’écriture au niveau des fichiers, ce qui peut être utile pour diagnostiquer les problèmes liés aux I/O Waits.
c) Utilisation de pg_stat_lwlock
Cette vue permet de voir les attentes liées aux LWLocks (Lightweight Locks), souvent impliquées dans les problèmes de performance liés à la gestion interne des ressources.
SELECT * FROM pg_stat_lwlock;
d) Outils externes
Des outils comme pg_top ou pg_stat_statements peuvent fournir des informations en temps réel sur les wait events dans PostgreSQL, vous aidant à surveiller la base de données en direct.
4. Analyse des Wait Events
a) Lock Waits : Dépistage des verrous
Lorsque plusieurs processus attendent l’accès à des ressources verrouillées, les performances peuvent être impactées. Vous pouvez analyser les verrous avec la vue pg_locks :
SELECT pid, locktype, relation::regclass, mode, granted
FROM pg_locks
WHERE not granted;
Cela permet de voir quel processus bloque l’accès à quelle table ou ligne et pourquoi.
b) I/O Waits : Goulots d’étranglement disque
Les I/O waits peuvent être un indicateur de surcharge sur les disques durs, particulièrement pour les bases de données volumineuses. Utilisez pg_stat_io pour identifier les fichiers ou les tables causant le plus d’attente.
c) Buffer Pin Waits : Analyse des conflits en mémoire
Les Buffer Pin Waits peuvent indiquer que plusieurs processus accèdent simultanément à un même ensemble de données, causant des conflits en mémoire. Vous pouvez analyser ces attentes avec les outils comme pg_stat_activity et ajuster la configuration pour améliorer l’utilisation des buffers.
d) LWLock Waits : Impact des verrous internes
Ces verrous légers (LWLocks) peuvent ralentir la gestion interne de PostgreSQL. Une trop forte contention sur les LWLocks peut indiquer des paramètres mal configurés, comme le manque de mémoire dédiée à PostgreSQL.
5. Bonnes Pratiques de Paramétrage pour Minimiser les Wait Events
a) Optimisation de la mémoire
shared_buffers
: Augmentez cette valeur pour que PostgreSQL puisse stocker plus de données en mémoire, réduisant ainsi les I/O Waits.work_mem
: Allouez plus de mémoire pour les opérations intermédiaires comme les tris et les hash joins, ce qui peut réduire le besoin d’accès disque.
shared_buffers = 25% of system memory
work_mem = 64MB
b) Gestion des WAL Logs
Les WAL Write Waits peuvent se produire si le système est surchargé par des écritures continues de transactions. Optimisez les paramètres liés au WAL :
wal_buffers
: Augmenter la taille des buffers WAL peut réduire la fréquence des écritures.checkpoint_timeout
: Ajuster le délai entre les checkpoints pour éviter des attentes longues lors de l’écriture des WAL.
wal_buffers = 16MB
checkpoint_timeout = 15min
c) Réduction des Lock Waits
Pour minimiser les Lock Waits, essayez d’optimiser vos transactions afin qu’elles soient aussi courtes que possible. Des transactions longues peuvent verrouiller des ressources pendant trop longtemps, impactant les performances.
- Utilisez des transactions plus petites : Essayez de diviser les longues transactions en opérations plus petites.
d) Réglage des processus de fond
Les processus de fond tels que l’autovacuum peuvent parfois causer des I/O Waits supplémentaires. Ajuster les paramètres d’autovacuum peut réduire l’impact sur les performances.
autovacuum_naptime = 10min
autovacuum_vacuum_cost_delay = 20ms
e) Amélioration des E/S disque
Si les I/O Waits sont fréquents, envisagez d’améliorer les performances d’E/S disque via :
- L’utilisation de disques SSD.
- La mise en place de RAID pour améliorer les performances en lecture et écriture.
- Une surveillance régulière avec pg_stat_io pour détecter les goulots d’étranglement.
Conclusion
Les wait events dans PostgreSQL sont des indicateurs précieux pour analyser la performance de votre base de données et identifier les points de contention. En comprenant les différents types d’attente, en utilisant les outils appropriés pour les détecter, et en appliquant des bonnes pratiques de paramétrage, vous pouvez considérablement améliorer les performances de vos systèmes PostgreSQL.
La surveillance continue, l’optimisation des verrous, de la mémoire et des entrées/sorties (IO) disque, ainsi qu’une gestion adaptée des transactions vous aideront à minimiser les wait events et à maximiser la disponibilité et la rapidité de votre base de données.
Merci!
Dans les outils utiles il y a aussi datasentinel, ça permet de visualiser les Average Active Sessions décomposées en événements d’attente (les DBA oracle utilisant Oracle Enterprise Manager ne seront pas dépaysés !)
Sinon je me suis fait un petit outil d’extraction depuis les vues toutes les N secondes, au format CSV que j’ouvre ensuite dans excel puis un rapport croisé dynamique graphique et hop, c’est pas mal aussi.
Merci beaucoup pour votre commentaire et vos retours ! En effet, DataSentinel est un produit payant, mais nous pensons qu’il offre une réelle valeur ajoutée en termes de surveillance et d’optimisation des performances de bases de données. Votre idée d’outil d’extraction est vraiment intéressante, bravo pour ça ! De notre côté, nous travaillons actuellement sur un nouvel outil de surveillance en temps réel basé sur l’ASH, avec des recommandations automatiques pour optimiser les performances. Nous avons hâte de pouvoir le partager avec vous prochainement !