Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🐘 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.

1.1

Panorama Monitoring PostgreSQL

Objectifs, métriques clés et limites de "juste regarder le CPU".

Health Perf SLA
1.2

Architecture Observabilité

DB + OS + mĂ©triques systĂšme + APM : qui mesure quoi, oĂč.

DB OS APM
1.3

Choisir ses outils (PMM & co)

Pourquoi PMM en #1 + rĂŽle de pgAdmin, Grafana, scripts maison.

PMM pgAdmin Grafana
2.1

Vues pg_stat essentielles

pg_stat_activity, pg_stat_database, pg_locks, I/O, temps CPU.

pg_stat_activity pg_locks
2.2

RequĂȘtes lentes & pg_stat_statements

Top requĂȘtes, normalisation, temps moyen, variance.

slow query pg_stat_statements
2.3

Logs PostgreSQL & auto_explain

ParamĂ©trage propre des logs + plans d’exĂ©cution auto.

logging auto_explain
3.1

Autovacuum & Bloat

Comprendre, mesurer et tuner l’Autovacuum sans le casser.

bloat vacuum
3.2

Indexes & Plans d’exĂ©cution

EXPLAIN, index manquants, index morts, sélectivité.

EXPLAIN indexes
3.3

ParamĂštres de Tuning

shared_buffers, work_mem, WAL, checkpoints, temps de commit.

memory WAL
4.1

PMM – Overview & Architecture

Pourquoi PMM est l’outil central en prod PostgreSQL.

Percona PMM
4.2

PMM – Installation rapide

DĂ©ploiement Docker + enregistrement d’un serveur PostgreSQL.

Docker agent
4.3

PMM – Dashboards clĂ©s

QPS, temps de requĂȘtes, bloat, Autovacuum, locks, I/O.

dashboards alertes
5.1

Alerting & SLA

Quelles alertes déclencher, et à partir de quels seuils ?

alertes SLA
5.2

MĂ©thodo d’audit PostgreSQL

Checklist d’analyse productive en 60–90 minutes.

audit checklist
5.3

Cheat-sheet Monitoring SQL

Les 30 commandes Ă  retenir pour survivre en prod.

psql SQL
1.1 Panorama Monitoring PostgreSQL
Pourquoi 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
NiveauFocusExemples
OSRessources globalesCPU, RAM, Swap, Disk I/O, réseau
PostgreSQLMĂ©canique internepg_stat_*, Autovacuum, WAL, temps de requĂȘtes
AppExpĂ©rience mĂ©tierTaux 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
1.2 Architecture d’ObservabilitĂ© autour de 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
BriqueResponsabilité principaleExemples
Agent OSMétriques systÚme (CPU, RAM, I/O, réseau)node_exporter, agent PMM
Exporter PostgreSQLExposure des vues pg_stat_* vers Prometheuspostgres_exporter (embed PMM)
PMM ServerStockage des métriques, dashboards, alertesPercona Monitoring & Management
APMTraces par endpoint, profiling applicatifDatadog APM, NewRelic, OpenTelemetry
Logs centralisésRecherche ciblée dans les logs PG et appELK, Loki, CloudWatch Logs

PMM ne remplace pas un APM complet, mais couvre trÚs bien la couche base de données.

1.3 Choisir ses outils PostgreSQL (PMM, pgAdmin, autres)
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
OutilUsage principalCommentaires
PMMMonitoring, dashboards, alertesLe choix par défaut en environnement sérieux.
pgAdminAdministration, requĂȘtage, visualisationIndispensable pour manipuler et inspecter.
psqlCLI lĂ©gĂšre et puissanteSouvent l’outil le plus rapide en crise.
Scripts DBAChecklist d’audit, reportingSpĂ©cifiques Ă  votre contexte / standards.
2.1 Vues pg_stat essentielles
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;
2.2 RequĂȘtes lentes & pg_stat_statements
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.

2.3 Logs PostgreSQL & auto_explain
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.

3.1 Autovacuum & Bloat
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.

3.2 Indexes & Plans d’exĂ©cution
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.

3.3 ParamĂštres de Tuning PostgreSQL
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.

4.1 PMM – Overview & Architecture
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...)
4.2 PMM – Installation rapide (Docker)
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.

4.3 PMM – Dashboards clĂ©s
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.

5.1 Alerting & SLA PostgreSQL
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.

5.2 MĂ©thodologie d’audit PostgreSQL
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
)
5.3 Cheat-sheet SQL/psql Monitoring
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;
Audit PostgreSQL en 30 minutes (version “flash”)
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”