Calculateur Pool de Connexions & BDD

Calculateur Pool de Connexions & BDD

Calculateur de pool de connexions et banc de dimensionnement de base de données de niveau production. Calculez précisément la taille optimale du pool par pod Kubernetes, prévenez le thread thrashing, estimez le temps d'attente en file et protégez la mémoire de la base contre les crashs OOM grâce à la loi de Little, aux formules de saturation HikariCP et aux ratios de multiplexage de PgBouncer.

Sélectionner un profil
Charge de travail & trafic
Dimensionnement direct

Calculez le dimensionnement optimal du pool et de la BDD à partir de votre trafic applicatif et du nombre de pods.

Trafic effectif traité 5,880 QPS
6.5 ms
Architecture & pooling
Ressources matérielles de la base
16 vCPU
Répartition de la mémoireAllocation mémoire saine (aucun risque d'OOM)
Buffer Pool: 32Go
Connexions
work_mem
Cache OS: 30.99Go
Mémoire tampon (shared_buffers / buffer pool): 32 GoMémoire allouée aux connexions backend: 720 MoMémoire de travail cumulée (work_mem): 312 MoCache du système d'exploitation (Page Cache OS): 30.99 Go (48.4%)
# ==============================================================================
# HikariCP Production Configuration (Spring Boot application.yml)
# Mode: forward_sizing | DB: postgresql
# Target Pod Replicas: 15 | Sized Pool per Pod: 4
# ==============================================================================
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:postgresql://db-cluster-endpoint:5432/app_db?sslmode=require
    hikari:
      pool-name: AppHikariPool
      maximum-pool-size: 4
      minimum-idle: 2
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
      leak-detection-threshold: 5000
      validation-timeout: 3000
      auto-commit: true
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
        useLocalSessionState: true
        rewriteBatchedStatements: true
Courbe de saturation et modélisation de la file d'attente (M/M/c)Point de fonctionnement: 38.2 connexions @ 0.00 ms
23466991Saturation matérielleCapacité du poolAxe XAxe Y
Point de LittleSaturation matérielleCapacité du poolZone de thrashing
Débit effectif (QPS)5,880
Concurrence (Loi de Little)38.2 connexions
Capacité matérielle du serveur33 connexions
Taille optimale du pool par pod4 connexions
Connexions backend totales requises60 connexions
Temps d'attente estimé en file0.00 ms
Référence technique et guide d'architecture

Calculateur Pool de Connexions & Sizing — Guide de référence

Calculateur de pool de connexions et outil de dimensionnement de bases de données pour environnements de production. Déterminez la taille optimale du pool par pod Kubernetes, éliminez le thread thrashing, estimez les temps d'attente en file et protégez la mémoire contre les crashs OOM (Out-Of-Memory) grâce à la loi de Little, aux formules de saturation HikariCP et au multiplexage de transactions PgBouncer.

Calculateur Pool de Connexions & Sizing — Guide de référence — Architecture en mémoire côté client et flux de données
Calculateur Pool de Connexions & Sizing — Guide de référence — Architecture en mémoire côté client et flux de données

Paramètres clés et contrôles

Cœurs CPU du serveur de base de données (vCPU)string

Nombre de cœurs physiques ou d'hyperthreads alloués à l'instance de base de données.

Par défaut : auto
Temps moyen d'exécution des requêtes (ms)string

Temps moyen de traitement des requêtes par le moteur de base de données, hors transit réseau et délai d'acquisition dans le pool.

Par défaut : auto
Ratio de multiplexage du proxystring

Nombre de connexions clientes applicatives prises en charge par une seule connexion backend persistante en mode transactionnel (PgBouncer ou AWS RDS Proxy).

Par défaut : auto
Multiplicateur de marge pour pics de chargestring

Marge de sécurité appliquée à la concurrence nominale de la loi de Little pour absorber les hausses soudaines de trafic.

Par défaut : auto

Conseils de pro et bonnes pratiques

Aligner minimumIdle sur maximumPoolSize

Avec HikariCP et les pools à haut débit, maintenez minimumIdle égal à maximumPoolSize afin de conserver un pool de taille fixe. Le redimensionnement dynamique en plein pic de trafic génère des handshakes TCP, des négociations TLS et des délais d'authentification au pire moment, lorsque le système est déjà sous forte charge.

Dimensionner depuis la base de données vers les pods

Ne déterminez jamais la taille d'un pool à l'échelle d'un pod sans confronter la somme cumulée aux plafonds CPU et mémoire de la base. Appliquez toujours la formule : pool_size_per_pod = (db_safe_connections / max_hpa_pod_replicas).

Prendre en compte le work_mem par nœud de requête dans PostgreSQL

Dans PostgreSQL, work_mem est alloué pour chaque opération de tri ou de hachage, et NON par connexion. Une requête complexe combinant plusieurs jointures et tris peut allouer 3 à 5 fois la valeur de work_mem en simultané. Un nombre excessif de connexions associé à un work_mem généreux déclenche immanquablement l'intervention brutale du tueur de processus Linux (OOM Killer).

Exploiter le mode transactionnel de PgBouncer avec requêtes préparées

Les versions modernes de PgBouncer (v1.21+) gèrent les requêtes préparées (prepared statements) au niveau du protocole en mode transactionnel. Veillez à ce que le pilote de votre application désactive la suppression des requêtes préparées nommées côté client ou utilise des instructions non nommées pour garantir une compatibilité totale avec PgBouncer.

Pièges courants et dépannage

⚠️HikariCP ConnectionTimeoutException / Expiration du délai d'acquisition

Identifiez les requêtes lentes à l'aide de pg_stat_activity ou du journal des requêtes lentes MySQL (slow query log) ; optimisez les requêtes avec des index composites ; si l'utilisation CPU de la base est modérée (< 50 %), augmentez prudemment la taille du pool ou installez PgBouncer.

⚠️Erreur PostgreSQL « FATAL: sorry, too many clients already »

Mettez en place PgBouncer en mode transactionnel entre les pods Kubernetes et PostgreSQL, ou réduisez maximumPoolSize par pod afin que (max_pods * pool_size) reste inférieur à max_connections.

⚠️Arrêt forcé du serveur de base de données par le tueur de mémoire Linux (OOM Killer)

Diminuez max_connections ou réduisez work_mem. Assurez-vous que l'ensemble formé par shared_buffers (souvent 25 % de la RAM) et max_connections * 20 Mo laisse au minimum 20 à 30 % de RAM libre pour le cache de pages du système d'exploitation.

Foire aux questions (FAQ)

Comment calculer la taille optimale d'un pool de connexions à une base de données ?▼

Le dimensionnement optimal repose sur deux piliers fondamentaux : la loi de Little pour la demande de concurrence applicative et les limites de saturation matérielle pour la capacité du serveur. Commencez par calculer la concurrence selon la loi de Little : Concurrence = QPS cible * (Temps d'exécution moyen des requêtes en secondes). Par exemple, 2 000 QPS avec une latence moyenne de 5 ms (0,005 s) nécessitent exactement 10 connexions actives. En ajoutant une marge de 30 % pour les pics, on obtient 13 connexions. Vérifiez ensuite le point d'équilibre matériel du serveur : ((Cœurs CPU * 2) + Broches disque/Spindles). Sur un serveur à 16 cœurs avec stockage SSD, le plafond matériel optimal est d'environ 33 connexions. Si vous déployez 5 pods Kubernetes, configurez le pool HikariCP de chaque pod à 3 connexions (soit 15 au total), ce qui reste parfaitement dans la limite matérielle des 33 connexions sans saturer la file d'attente.

Pourquoi HikariCP recommande-t-il la formule pool size = (core_count * 2) + effective_spindle_count ?▼

Cette formule empirique a été popularisée par Brett Wooldridge (créateur d'HikariCP) à partir de benchmarks matériels menés par des ingénieurs de performance chez PostgreSQL et Oracle. Un cœur CPU physique ne peut exécuter qu'un seul flux d'instructions à la fois. Lorsqu'une requête lit des données en mémoire cache, 1 connexion sature intégralement 1 cœur. Toutefois, lors des attentes d'entrées/sorties disque (même sur du stockage NVMe ultra-rapide), le thread passe en état d'attente I/O, ce qui permet à un second thread d'exploiter le processeur. Allouer une deuxième connexion par cœur ((Cœurs * 2)), complétée par un facteur de broches effectives (spindles), permet de saturer le pipeline CPU sans provoquer de changements de contexte excessifs. Des benchmarks réels ont prouvé que la réduction d'un pool de 2 048 à 96 connexions a fait chuter la latence moyenne de 100 ms à 2 ms tout en augmentant le débit global.

Quels sont les risques d'un pool de connexions surdimensionné pour la base de données ?▼

Un surdimensionnement des connexions déclenche trois modes de défaillance critiques : 1) Emballement des changements de contexte CPU (thrashing) : lorsque des centaines de threads se disputent les cœurs CPU, le noyau passe plus de temps à sauvegarder et restaurer les registres qu'à exécuter du code SQL. 2) Épuisement de la mémoire et crashs OOM : chaque connexion alloue de la mémoire de session privée (mémoire backend dédiée dans PostgreSQL ou tampons de thread dans MySQL). Lors de requêtes effectuant des tris ou du hachage, la mémoire cumulée dépasse la RAM physique disponible, forçant le tueur OOM de Linux à achever le processus principal de la base de données. 3) Saturation des files d'E/S disque : des écritures concurrentes excessives engorgent les contrôleurs disque et les files d'attente de cache, faisant flamber les temps d'attente I/O et provoquant des cascades de timeouts sur l'ensemble des microservices.

Comment dimensionner les pools de connexions répartis sur plusieurs pods Kubernetes ou microservices ?▼

Pour dimensionner des pools répartis sur des microservices ou des pods Kubernetes soumis à l'autoscaling, raisonnez toujours depuis la base de données vers l'extérieur, et non l'inverse. Déterminez d'abord le budget maximal de connexions admissibles par votre base (par exemple max_connections = 200, dont 20 réservées aux DBA et au monitoring, soit 180 pour les applications). Évaluez le nombre maximal de réplicas de pods prévu lors du pic de charge du Horizontal Pod Autoscaler (HPA), par exemple 30 pods. Divisez ce budget par le nombre maximal de pods : 180 / 30 = 6 connexions par pod. Si 6 connexions par pod ne suffisent pas à satisfaire la loi de Little pour votre cible de QPS, vous devez obligatoirement intercaler un multiplexeur de connexions en mode transactionnel (comme PgBouncer ou AWS RDS Proxy) plutôt que d'augmenter la taille des pools par pod.

Quelle est la différence entre le pooling de session et le pooling de transaction dans PgBouncer ?▼

En mode Pooling de Session (Session Pooling), PgBouncer affecte une connexion serveur dédiée à l'application cliente dès son ouverture et la conserve jusqu'à sa déconnexion explicite. Ce mode prend en charge toutes les fonctionnalités SQL, mais n'offre qu'un gain de multiplexage négligeable pour des pools applicatifs permanents. En mode Pooling de Transaction (Transaction Pooling), PgBouncer n'attribue une connexion physique à la base que pendant la durée exacte d'une transaction (BEGIN ... COMMIT). Dès que la transaction se termine, la connexion retourne au pool pour être réassignée instantanément à un autre pod, permettant un ratio de multiplexage de 5:1 à 10:1. En contrepartie, le mode transactionnel restreint certaines fonctionnalités liées à la session comme LISTEN/NOTIFY, les requêtes PREPARE sans nommage explicite, les tables temporaires et les verrous applicatifs au niveau session (advisory locks).

Quelle quantité de mémoire vive consomme chaque connexion PostgreSQL ou MySQL ?▼

Dans PostgreSQL, chaque connexion instancie un processus système distinct consommant environ 5 à 10 Mo de mémoire résidente de base. De plus, chaque processus backend actif alloue dynamiquement du work_mem (4 Mo par défaut) pour chaque opération de tri, de hachage ou de jointure au sein d'une requête. Une requête complexe comportant 3 opérations de tri/hachage peut ainsi consommer 12 Mo de work_mem supplémentaires, portant l'empreinte de la connexion à 22 Mo. Dans MySQL (moteur InnoDB), chaque connexion utilise un thread système mobilisant environ 256 Ko à 1 Mo d'espace de pile, complété par les tampons de session (read_buffer_size, sort_buffer_size, join_buffer_size), soit une moyenne de 2 à 6 Mo par connexion. Configurer 1 000 connexions PostgreSQL exige ainsi de réserver entre 10 et 20 Go de RAM uniquement pour les processus de connexion, ce qui ampute directement les ressources allouables aux shared_buffers et au cache de pages (page cache) du système d'exploitation.

Outils et utilitaires connexes

Tous les outils →