🚀 9) Runbook de mise en prod
Objectif : définir une méthodologie pas-à-pas pour appliquer, tester et valider les réglages de performance avant et après la mise en production.
Pré-prod & Réglages Initiaux
Baseline, réglages OS & PG, configuration du pooler et déploiement de l'observabilité.
Tests de Charge & Itération
Valider les changements via pgbench et charges réelles, puis ajuster un paramètre à la fois.
Maintenance & Revue
Planifier la maintenance (vacuum, reindex) et revoir périodiquement les performances (top requêtes, croissance).
Mesures de base (avant)
Capturer l'état actuel pour comparer "avant/après". À faire sur une période représentative (ex: 1 heure de pic).
- TPS : Transactions par seconde (depuis
pg_stat_database). - Latences : P95/P99 des requêtes principales.
- Hit Cache Ratio :
blks_hit / (blks_hit + blks_read). Viser > 99% pour OLTP. - WAL/s : Volume de WAL généré (
pg_current_wal_lsn()). - Temp Files : Nombre et taille des fichiers temporaires (
log_temp_files). - Bloat : Estimation du bloat sur les tables et index majeurs.
- Top N Requêtes : Capturer le top 50 de
pg_stat_statements(total_exec_time, calls, mean_exec_time).
-- Activer pg_stat_statements si ce n'est pas fait CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- (Nécessite un ajout dans shared_preload_libraries)
Appliquer réglages OS
S'assurer que l'OS ne pénalise pas la DB (voir Section 4).
- THP : Désactiver (
echo never > .../transparent_hugepage/enabled). - HugePages : Activer si
shared_buffersest grand (ex: > 16GB). - Options FS :
noatime,discard/trim (SSD/NVMe). - Scheduler I/O :
mq-deadlineounonepour NVMe.
⚠️ Un redémarrage du serveur (OS) peut être nécessaire pour THP ou HugePages.
Configurer PgBouncer
Le pooler est essentiel pour gérer un grand nombre de connexions applicatives.
- Installer et configurer PgBouncer (
pool_mode = transaction). - Pointer les applications vers PgBouncer.
- Réduire
max_connectionsPostgreSQL (ex: 100-200) car PgBouncer gère le multiplexage.
Ajuster Mémoire & WAL
Utiliser les formules de la Section 3 pour définir une base solide.
shared_buffers(ex: 25% RAM)work_mem(ex: RAM_libre / (max_connections * 2))maintenance_work_mem(ex: 5-10% RAM)max_wal_size(ex: 16-64GB)checkpoint_completion_target(0.9)
Calibrer Autovacuum
Le réglage par défaut n'est pas adapté aux grosses tables.
- Baisser
autovacuum_vacuum_scale_factorpour les grosses tables. - Exemple pour une table de 100M lignes :
ALTER TABLE grosse_table SET ( autovacuum_vacuum_scale_factor = 0.02, -- 2% autovacuum_analyze_scale_factor = 0.01 -- 1% );
Augmenter autovacuum_max_workers si nécessaire.
Déployer l'Observabilité
On ne peut pas tuner ce qu'on ne voit pas. (Voir Section 6).
- Exporter : Mettre en place un exporteur (ex:
pg_exporterpour Prometheus). - Dashboards : Configurer des dashboards Grafana (ou équivalent) pour visualiser :
- TPS, Latences, Hit Cache, WAL, Temp files, Bloat
- Saturation CPU, RAM, I/O Wait, Réseau
- État de l'autovacuum, connexions, locks
- Alertes : Définir des alertes de base (ex: disque plein, réplication en retard, I/O wait > 20%, P99 > 500ms).
Stratégie de Test
Utiliser pgbench pour un test standardisé et simuler des charges réelles (via l'application ou un outil type Gatling/k6) pour valider le comportement applicatif.
# Initialiser pgbench (scale 100) pgbench -i -s 100 ma_db # Test TPC-B (64 clients, 2 threads, 300s) pgbench -c 64 -j 2 -T 300 ma_db
Boucle d’itération
Ne changer qu'un seul paramètre à la fois.
- Changer 1 paramètre (ex: augmenter
work_memde 16MB à 32MB). - Recharger la configuration (
SELECT pg_reload_conf();). - Lancer le test de charge (ou observer le trafic réel) pendant 30–60 minutes.
- Comparer les KPIs (P95, temp files, I/O wait) avec la baseline.
- Le changement est-il bénéfique ? Si oui, on garde. Si non, on annule.
- Passer au paramètre suivant.
Paramètres clés à varier
| Paramètre | Objectif |
|---|---|
| work_mem | Réduire les "temp files" (tris sur disque) |
| max_wal_size | Lisser les checkpoints, réduire I/O spikes |
| random_page_cost | Informer le planner du coût I/O (baisser si SSD) |
| Parallélisme | max_parallel_workers_per_gather |
KPIs à observer pendant le test
| KPI | Outil / Métrique |
|---|---|
| Latence P95/P99 | Dashboard / pg_stat_statements |
| Temp Files | log_temp_files / Dashboard |
| I/O Wait | iostat / top (wa) / Dashboard |
| CPU | top (us, sy, wa) |
Plan de Maintenance
Opérations régulières pour maintenir la santé de la base de données.
| Opération | Fréquence |
|---|---|
| VACUUM (VERBOSE, ANALYZE) | Périodique (nuit/weekend) sur tables clés |
| REINDEX (ciblé) | Si bloat d'index > 30-40% |
| pg_repack | Si bloat de table > 30% (online) |
| Contrôle Freeze | Surveiller txid_current_age |
-- Lancer un vacuum manuel avec détails VACUUM (VERBOSE, ANALYZE) ma_table;
Revue Trimestrielle
Prendre du recul pour identifier les nouvelles tendances et les problèmes émergents.
Checklist de Revue
- Top requêtes lentes : Analyser
pg_stat_statements. Y a-t-il de nouvelles requêtes lentes ? - Index manquants / inutilisés : Utiliser des requêtes de diagnostic.
- Partitions : Les nouvelles partitions sont-elles créées ? Faut-il purger les anciennes ?
- Croissance des tables : Identifier les tables à plus forte croissance. Le bloat est-il maîtrisé ?
- Paramètres Planner : Les statistiques sont-elles à jour (
ANALYZE) ?
