đ PostgreSQL â Monitoring & Tuning (avec PMM)
Tableau de bord IDEO-Lab pour instrumenter, surveiller et optimiser un cluster PostgreSQL : vues systĂšme, logs, Autovacuum, PMM, alerting & checklist tuning.
Panorama Monitoring PostgreSQL
Objectifs, métriques clés et limites de "juste regarder le CPU".
Health Perf SLAArchitecture Observabilité
DB + OS + mĂ©triques systĂšme + APM : qui mesure quoi, oĂč.
DB OS APMChoisir ses outils (PMM & co)
Pourquoi PMM en #1 + rĂŽle de pgAdmin, Grafana, scripts maison.
PMM pgAdmin GrafanaVues pg_stat essentielles
pg_stat_activity, pg_stat_database, pg_locks, I/O, temps CPU.
pg_stat_activity pg_locksRequĂȘtes lentes & pg_stat_statements
Top requĂȘtes, normalisation, temps moyen, variance.
slow query pg_stat_statementsLogs PostgreSQL & auto_explain
ParamĂ©trage propre des logs + plans dâexĂ©cution auto.
logging auto_explainAutovacuum & Bloat
Comprendre, mesurer et tuner lâAutovacuum sans le casser.
bloat vacuumIndexes & Plans dâexĂ©cution
EXPLAIN, index manquants, index morts, sélectivité.
EXPLAIN indexesParamĂštres de Tuning
shared_buffers, work_mem, WAL, checkpoints, temps de commit.
memory WALPMM â Overview & Architecture
Pourquoi PMM est lâoutil central en prod PostgreSQL.
Percona PMMPMM â Installation rapide
DĂ©ploiement Docker + enregistrement dâun serveur PostgreSQL.
Docker agentPMM â Dashboards clĂ©s
QPS, temps de requĂȘtes, bloat, Autovacuum, locks, I/O.
dashboards alertesAlerting & SLA
Quelles alertes déclencher, et à partir de quels seuils ?
alertes SLAMĂ©thodo dâaudit PostgreSQL
Checklist dâanalyse productive en 60â90 minutes.
audit checklistCheat-sheet Monitoring SQL
Les 30 commandes Ă retenir pour survivre en prod.
psql SQLPourquoi monitorer PostgreSQL âvraimentâ
Surveiller PostgreSQL ne se limite pas à regarder le CPU de la VM. Le but est de détecter tÎt les signaux faibles :
- RequĂȘtes qui dĂ©rivent (temps moyen qui augmente).
- Bloat qui progresse sur certaines tables.
- Autovacuum qui nâarrive plus Ă suivre.
- Locks rĂ©currents sur des patterns de requĂȘtes.
- Checkpoints trop fréquents ou trop rares.
Lâenjeu : tenir le SLA (latence / disponibilitĂ©) en Ă©vitant les âincidents surprisesâ Ă 3h du matin, et disposer dâĂ©lĂ©ments factuels pour justifier une montĂ©e en gamme (RAM, IOPS, refonte applicativeâŠ).
3 niveaux de monitoring
| Niveau | Focus | Exemples |
|---|---|---|
| OS | Ressources globales | CPU, RAM, Swap, Disk I/O, réseau |
| PostgreSQL | MĂ©canique interne | pg_stat_*, Autovacuum, WAL, temps de requĂȘtes |
| App | ExpĂ©rience mĂ©tier | Taux dâerreur, latence API, throughput mĂ©tier |
Un bon setup de monitoring croise ces 3 couches. PMM fournit dĂ©jĂ une grande partie du niveau OS+PostgreSQL, quâon complĂšte avec un APM et quelques dashboards maison.
MĂ©triques âvitalesâ Ă suivre
TOP MĂTRIQUES POSTGRESQL Ă SURVEILLER 1ïžâŁ Charge & Concurrence - Nombre de connexions actives vs max_connections - Sessions en attente de lock (pg_locks, wait_event) - Longueur moyenne des transactions 2ïžâŁ Performance requĂȘtes - Temps de rĂ©ponse moyen / 95e / 99e percentile - RequĂȘtes les plus coĂ»teuses (pg_stat_statements) - Nombre de requĂȘtes / seconde (QPS) 3ïžâŁ Autovacuum & Bloat - Tables les plus gonflĂ©es (bloat estimation) - Age des transactions (wraparound risk) - Autovacuum n_tup_ins / n_tup_upd / n_tup_del 4ïžâŁ I/O & Buffers - Hit ratio du cache (shared_buffers) - Temps de lecture disque vs RAM - Checkpoints et taille du WAL 5ïžâŁ SantĂ© globale - Lag de rĂ©plication (si replicas) - Erreurs dans les logs PostgreSQL - RedĂ©marrages du service PostgreSQL
Vue schématique
[Architecture type PostgreSQL + Observabilité]
+-------------------------------+
| Applications / API |
| (APM : traces, erreurs) |
+-------------------------------+
|
v
+-------------------------------+
| PostgreSQL (primary + replicas) |
| - pg_stat_* |
| - Logs + auto_explain |
| - vues monitoring custom |
+-------------------------------+
|
v
+-------------------------------+
| PMM Server (Prometheus + Grafana) |
| - Exporters PG / OS |
| - Dashboards pré-packagés |
| - Alerting rules |
+-------------------------------+
|
v
+-------------------------------+
| SystĂšme dâalerting & On-call |
| (email, Slack, PagerDuty...) |
+-------------------------------+LâidĂ©e : une seule âtour de contrĂŽleâ pour tout ce qui est PostgreSQL, avec PMM au centre, et des intĂ©grations vers lâoutillage existant (on-call, APM, logs centralisĂ©s).
RÎles des différentes briques
| Brique | Responsabilité principale | Exemples |
|---|---|---|
| Agent OS | Métriques systÚme (CPU, RAM, I/O, réseau) | node_exporter, agent PMM |
| Exporter PostgreSQL | Exposure des vues pg_stat_* vers Prometheus | postgres_exporter (embed PMM) |
| PMM Server | Stockage des métriques, dashboards, alertes | Percona Monitoring & Management |
| APM | Traces par endpoint, profiling applicatif | Datadog APM, NewRelic, OpenTelemetry |
| Logs centralisés | Recherche ciblée dans les logs PG et app | ELK, Loki, CloudWatch Logs |
PMM ne remplace pas un APM complet, mais couvre trÚs bien la couche base de données.
Pourquoi PMM est souvent lâoutil #1 en prod
- Open-source, gratuit, stack standard (Prometheus + Grafana).
- Dashboards prĂȘts pour PostgreSQL, MySQL, Mongo, etc.
- Agents simples à déployer (Docker, packages, Kubernetes).
- Vue consolidée multi-serveurs / multi-environnements.
- Alerting déjà pré-configuré (latence, bloat, connexions, etc.).
RĂSUMĂ STRATĂGIQUE - PMM = tour de contrĂŽle PostgreSQL - pgAdmin = admin / requĂȘtage / JIT troubleshooting - APM (Datadog / NewRelic etc.) = vision business / endpoints - Scripts maison = analyse fine ponctuelle (audit, migration)
Panorama rapide
| Outil | Usage principal | Commentaires |
|---|---|---|
| PMM | Monitoring, dashboards, alertes | Le choix par défaut en environnement sérieux. |
| pgAdmin | Administration, requĂȘtage, visualisation | Indispensable pour manipuler et inspecter. |
| psql | CLI lĂ©gĂšre et puissante | Souvent lâoutil le plus rapide en crise. |
| Scripts DBA | Checklist dâaudit, reporting | SpĂ©cifiques Ă votre contexte / standards. |
Les vues que tout DBA PostgreSQL doit connaĂźtre
- pg_stat_activity : sessions en cours, Ă©tat, requĂȘte en cours.
- pg_stat_database : stats globales par base (tuples lus / écrits, temps CPU).
- pg_stat_user_tables : stats par table (seq scan, index scan, vacuum).
- pg_stat_user_indexes : utilisation réelle des indexes.
- pg_locks : locks actuels, qui bloque qui.
- pg_stat_bgwriter : activitĂ©s dâĂ©criture en background.
Exemples de requĂȘtes utiles
-- Voir les requĂȘtes longues en cours (> 30 s)
SELECT pid, usename, datname, state,
now() - query_start AS runtime,
query
FROM pg_stat_activity
WHERE state <> 'idle'
AND now() - query_start > interval '30 seconds'
ORDER BY runtime DESC;
-- Hit ratio global par base
SELECT datname,
blks_hit, blks_read,
round(100 * blks_hit::numeric / NULLIF(blks_hit + blks_read,0), 2) AS cache_hit_ratio
FROM pg_stat_database
ORDER BY cache_hit_ratio ASC;
-- Index jamais utilisés
SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY relname;Activer pg_stat_statements
-- postgresql.conf shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.track = all -- AprĂšs ajout : redĂ©marrer PostgreSQL -- Activer lâextension dans chaque base concernĂ©e CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Lâextension agrĂšge les requĂȘtes ânormalisĂ©esâ (bind variables anonymisĂ©es) et conserve des stats : temps total, nombre dâappels, temps moyen, variance, etc.
Top requĂȘtes Ă optimiser
-- Top 20 requĂȘtes par temps cumulĂ©
SELECT query,
calls,
round(total_time::numeric, 2) AS total_ms,
round(mean_time::numeric, 2) AS mean_ms,
rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 20;
-- Top requĂȘtes par temps moyen (avec au moins 100 appels)
SELECT query,
calls,
round(mean_time::numeric, 2) AS mean_ms
FROM pg_stat_statements
WHERE calls >= 100
ORDER BY mean_time DESC
LIMIT 20;StratĂ©gie : trier par temps total (impact global), puis par temps moyen pour repĂ©rer les requĂȘtes pathologiques.
ParamÚtres recommandés
# postgresql.conf (exemple) log_destination = 'csvlog' logging_collector = on log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d.log' log_rotation_age = '1d' log_min_duration_statement = 500ms log_line_prefix = '%m [%p] %u@%d %h '
log_min_duration_statement : commencer Ă 500 ms ou 1 s en prod, puis ajuster selon le trafic. Lâessentiel est dâavoir une base de rĂ©fĂ©rence pour voir les rĂ©gressions.
auto_explain : logger des plans dâexĂ©cution
# postgresql.conf shared_preload_libraries = 'pg_stat_statements,auto_explain' # Paramétrage de base auto_explain.log_min_duration = '500ms' auto_explain.log_analyze = on auto_explain.log_verbose = on auto_explain.log_buffers = on auto_explain.log_timing = on
Attention Ă ne pas logguer toutes les requĂȘtes en dĂ©tail (coĂ»t I/O Ă©norme). LâidĂ©e est de cibler les requĂȘtes lentes et de pouvoir analyser leurs plans sans perturber la prod.
RĂŽle de lâAutovacuum
PostgreSQL ne réécrit pas les lignes en place : il marque les anciennes versions comme mortes. LâAutovacuum a deux rĂŽles :
- Recycler lâespace (bloat) en marquant les pages rĂ©utilisables.
- Ăviter le âwraparoundâ (ID de transaction qui dĂ©borde).
Un mauvais tuning dâAutovacuum peut provoquer :
- Bloat massif â tables Ă©normes â I/O catastrophique.
- Vacuum agressifs â spikes de latence.
- Risque de wraparound â arrĂȘt forcĂ©.
Surveiller & ajuster
-- Derniers vacuums/analyses par table
SELECT relname, last_vacuum, last_autovacuum,
last_analyze, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY last_autovacuum DESC NULLS LAST;
-- Tables les plus âgonflĂ©esâ (exemple simple)
SELECT schemaname, relname,
n_live_tup, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 20;Stratégie : identifier les tables qui se gonflent le plus (beaucoup de mises à jour/suppressions), ajuster les paramÚtres autovacuum_vacuum_* par table si nécessaire, et surveiller les temps de vacuum via PMM.
EXPLAIN / EXPLAIN ANALYZE
-- Exemple simple EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 1234;
à lire : type de scan (Seq Scan, Index Scan, Bitmap), coût estimé vs temps réel, nombre de lignes estimé vs réel, utilisation des indexes existants.
Detecter les indexes Ă problĂšme
-- Index jamais scannĂ©s SELECT schemaname, relname, indexrelname, idx_scan FROM pg_stat_user_indexes WHERE idx_scan = 0 ORDER BY relname; -- Tables oĂč il manque probablement des indexes SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables WHERE seq_scan > 0 AND idx_scan = 0 ORDER BY seq_scan DESC;
Un bon monitoring des indexes combine ces vues avec des dashboards (PMM, Grafana) pour suivre lâĂ©volution dans le temps, pas juste un snapshot.
ParamÚtres mémoire
shared_buffers ~ 25% de la RAM (cas gĂ©nĂ©ral) work_mem dĂ©pend du pattern requĂȘtes / connexions maintenance_work_mem pour VACUUM, index creation effective_cache_size estimation du cache total (OS + PG)
Le monitoring sert ici Ă valider les hypothĂšses : hit ratio correct, pas trop de sorts en disque, etc.
WAL & checkpoints
Checkpoints trop fréquents = I/O en dents de scie. Trop rares = recovery plus long, plus de WAL à rejouer.
checkpoint_timeout (5min Ă 15min) max_wal_size (taille totale WAL avant checkpoint) checkpoint_completion_target (0.7 Ă 0.9)
Suivre via PMM les mĂ©triques liĂ©es aux checkpoints et au WAL pour ajuster sans ĂȘtre Ă lâaveugle.
PMM en deux phrases
Percona Monitoring & Management (PMM) est une solution open-source qui fournit :
- Collecte de métriques (Prometheus, exporters).
- Dashboards prĂȘts Ă lâemploi (Grafana).
- Alertes basées sur des rÚgles sensibles au contexte DB.
Architecture PMM
[PMM] PostgreSQL & OS | | (exporters / agents) v PMM Server (Prometheus + Grafana) | +-- UI Web (dashboards, explore, alert manager) | +-- Intégration alerting (email, Slack, webhooks...)
PMM Server via Docker
docker run -d \ -p 8443:443 \ --name pmm-server \ --restart always \ -v pmm-data:/srv \ percona/pmm-server:latest
Puis ouvrir lâURL web (https://host:8443) et terminer la configuration.
Enregistrer un serveur PostgreSQL
# Sur le serveur PostgreSQL sudo pmm-admin config --server-url=https://admin:pass@pmm-server:443 # Ajouter lâinstance PostgreSQL sudo pmm-admin add postgresql \ --username=monitoring_user \ --password=******** \ --query-source=pgstatmonitor \ mypg-prod
Une fois lâinstance ajoutĂ©e, les dashboards PostgreSQL de PMM commencent Ă se remplir automatiquement.
Dashboards Ă regarder au quotidien
- PostgreSQL Overview : connexions, temps de requĂȘtes, QPS.
- PostgreSQL Queries : top requĂȘtes, temps moyen, plans.
- PostgreSQL InnoDB / Buffers : hit ratio, caches.
- PostgreSQL Replication : lag, état des replicas.
- Node Overview : CPU, RAM, I/O, load average.
LâintĂ©rĂȘt : corrĂ©ler les Ă©vĂ©nements (pic de CPU, explosion du nombre de requĂȘtes, lancement dâun batch) pour raconter une histoire cohĂ©rente lors dâun incident.
Exemples dâalertes raisonnables
Exemples de rĂšgles (Ă adapter) : - Connexions actives > 80% de max_connections pendant 5 min - Cache hit ratio < 97% sur 10 min - Lag de rĂ©plication > 30 s sur 5 min - Nombre de requĂȘtes > 1 s > X par minute - Autovacuum bloquĂ© / wraparound risk Ă < 1 semaine
Le but nâest pas de spammer les on-call, mais de signaler les situations vraiment dangereuses avant lâimpact utilisateur.
Audit rapide en 60â90 minutes
1ïžâŁ Contexte - Version PostgreSQL, OS, type de stockage, volumĂ©trie - Pattern de trafic (API, batch, BIâŠ) 2ïžâŁ SantĂ© globale - Hit ratio, connexions, lag de rĂ©plication - Checkpoints, erreurs dans les logs 3ïžâŁ RequĂȘtes - pg_stat_statements : top N par temps total / moyen - Quelques EXPLAIN ANALYZE ciblĂ©s 4ïžâŁ Autovacuum & bloat - Tables les plus actives - ParamĂ©trage autovacuum global & par table 5ïžâŁ Indices & schema - Index non utilisĂ©s - Tables trĂšs scannĂ©es en sĂ©quentiel 6ïžâŁ Reco - Quick wins (index, paramĂštres, tĂąches de maintenance) - Pistes moyen terme (refactor, partitionnementâŠ)
psql â survie en prod
\l -- lister les bases \dt+ -- lister les tables + taille \di+ -- lister les indexes \dn -- lister les schemas \df+ -- lister les fonctions \x on -- mode Ă©tendu (vertical) \watch 5 -- rĂ©pĂ©ter la derniĂšre requĂȘte toutes les 5 s
TOP requĂȘtes utiles
-- Sessions actives
SELECT * FROM pg_stat_activity WHERE state <> 'idle';
-- Tables les plus lourdes
SELECT relname,
pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
-- Lag de réplication
SELECT application_name, state, sync_state,
pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(), replay_location)) AS lag
FROM pg_stat_replication;CHECKLIST 30 MIN 1. Health rapide (5 min) - Hit ratio global - Connexions actives vs max - Lag de rĂ©plication - Erreurs rĂ©centes dans les logs 2. RequĂȘtes (10 min) - Top N pg_stat_statements par temps total - 2â3 EXPLAIN ANALYZE sur les plus suspectes 3. Autovacuum & bloat (10 min) - Tables avec beaucoup de dead tuples - Autovacuum rĂ©cent ou non - Risque de wraparound 4. Reco express (5 min) - 2â3 quick wins (index, paramĂštres, maintenance) - Rappeler les limitations du âflash auditâ
