Comment augmenter le nombre maximal de connexions de mon instance Amazon RDS for MySQL ou Amazon RDS for PostgreSQL ?

Lecture de 10 minute(s)
0

Je souhaite augmenter le nombre maximum de connexions pour mon instance Amazon Relational Database Service (Amazon RDS) for MySQL ou Amazon RDS for PostgreSQL.

Résolution

Afficher la valeur actuelle de max_connections

Dans Amazon RDS for MySQL, la métrique max_connections permet de surveiller le nombre maximal de connexions clients simultanées (autorisées).

Par défaut, le paramètre max_connections est basé sur la formule suivante dans Amazon RDS for MySQL (calculée à partir de la valeur DBInstanceClassMemory) :

max_connections = DBInstanceClassMemory/12582880

Pour vérifier la valeur actuelle du paramètre max_connections, exécutez la commande suivante après vous être connecté à votre instance Amazon RDS for MySQL :

SHOW GLOBAL VARIABLES LIKE 'max_connections';

Dans Amazon RDS for PostgreSQL, la métrique max_connections permet de surveiller le nombre maximal de connexions simultanées. Par défaut, le paramètre max_connections est basé sur la formule suivante dans Amazon RDS for PostgreSQL (calculée à partir de la valeur DBInstanceClassMemory) :

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

Pour vérifier la valeur actuelle du paramètre max_connections, exécutez la commande suivante après vous être connecté à votre instance Amazon RDS for PostgreSQL :

postgres=> show max_connections;

La valeur par défaut de max_connections pour RDS for MySQL et RDS for PostgreSQL dépend de la classe d'instance utilisée par l'instance Amazon RDS. Une classe d'instance de base de données avec plus de mémoire disponible prend en charge un plus grand nombre de connexions à la base de données.

Notez que le nombre par défaut de max_connections calculé à l'aide de la formule peut légèrement différer du nombre de connexions par défaut renvoyé par la commande précédente. Cela est dû au fait qu'une partie de la mémoire totale de DBInstanceClassMemory est réservée aux opérations du système d'exploitation sous-jacent. La commande précédente ne prend en compte que la mémoire réservée au moteur PostgreSQL et non au système d'exploitation hôte sous-jacent.

Revoir les raisons du trop grand nombre de connexions

Lorsque le nombre de connexions client dépasse la valeur max_connections, vous obtenez des erreurs similaires aux suivantes :

Les facteurs suivants peuvent conduire vos connexions à la base de données à dépasser la valeur max_connections :

Augmentation du nombre de connexions clients/applications à l'instance de base de données : cela est dû à une charge de travail accrue ou à un verrouillage au niveau des tables/lignes.

Fermeture incorrecte d'une connexion client ou d'une application après la fin d'une opération : lorsqu'une connexion au serveur n'est pas correctement fermée, l'application cliente ouvre une nouvelle connexion. Au fil du temps, ces nouvelles connexions au serveur peuvent entraîner le dépassement de la valeur max_connections pour votre instance. Pour répertorier toutes les connexions actives pour votre instance de base de données RDS for MySQL, exécutez la commande suivante :

SHOW FULL PROCESSLIST

Pour afficher les connexions de chaque base de données de votre instance RDS for PostgreSQL, exécutez la commande suivante :

SELECT datname, numbackends FROM pg_stat_database;

Connexions en veille : les connexions en veille, également appelées connexions ouvertes inactives, sont provoquées lorsque vous définissez des valeurs plus élevées pour les paramètres de délai d'expiration de connexion, tels que wait_timeout ou interactive_timeout dans MySQL. Si vous configurez une limite de connexion trop élevée, vous risquez de vous retrouver avec une utilisation de la mémoire plus importante, même si ces connexions ne sont pas utilisées. Par conséquent, lorsque le serveur d'applications tente d'ouvrir toutes les connexions clients à la base de données, ces connexions peuvent être refusées. Pour mettre fin à une connexion en veille dans une instance de base de données RDS for MySQL, exécutez la commande suivante :

CALL mysql.rds_kill(example-pid);

Connexions inactives : vous pouvez afficher les connexions inactives dans une instance RDS for PostgreSQL en exécutant la requête suivante. La requête suivante affiche des informations sur les processus dorsaux présentant l'un des états suivants pendant plus de 15 minutes : « inactif », « inactif dans la transaction », « inactif dans la transaction (abandonné) » et « désactivé ».

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Pour mettre fin à une connexion inactive dans une instance RDS for PostgreSQL, exécutez la commande suivante :

SELECT pg_terminate_backend(example-pid)

Conseil : une bonne pratique consiste à ne configurer que les connexions actives nécessaires aux performances de l'application. Vous pouvez également envisager une mise à niveau vers une classe d'instance de base de données Amazon RDS plus importante.

Augmenter la valeur max_connections

Vous pouvez augmenter le nombre maximum de connexions à votre instance de base de données RDS for MySQL ou RDS for PostgresSQL à l'aide des méthodes suivantes :

  • Définissez une valeur plus grande pour le paramètre max_connections à l'aide d'un groupe de paramètres personnalisé au niveau de l'instance. L'augmentation du paramètre max_connections ne provoque pas d'interruption. Même si vous pouvez augmenter la valeur de max_connections au-delà de la valeur par défaut, ce n'est pas une bonne pratique. En effet, l'instance peut rencontrer des problèmes lorsque la charge de travail augmente et que davantage de mémoire est requise. Une augmentation du nombre de connexions peut entraîner une hausse de l'utilisation de la mémoire. Les instances qui viennent à manquer de mémoire peuvent planter. Cela est particulièrement vrai pour les instances de petite taille. Si vous augmentez la valeur max_connections, veillez à surveiller l'utilisation des ressources. Assurez-vous également de consulter votre administrateur de base de données au sujet de l'augmentation. Une bonne pratique consiste à conserver la valeur par défaut, ou à passer à une classe d'instance supérieure lorsque davantage de connexions sont nécessaires.
  • Si votre instance de base de données utilise un groupe de paramètres par défaut, remplacez le groupe de paramètres par un groupe de paramètres personnalisé. Veillez à associer le groupe de paramètres de base de données personnalisé à votre instance Amazon RDS et à la redémarrer. Une fois que le nouveau groupe de paramètres personnalisé est associé à votre instance de base de données, vous pouvez modifier la valeur du paramètre max_connections. Pour plus d'informations, consultez Comment modifier les valeurs d'un groupe de paramètres de base de données Amazon RDS ?
    Remarque : la modification du groupe de paramètres peut entraîner une interruption. Pour plus d'informations, consultez Utilisation des groupes de paramètres de base de données.
  • Mettez à l'échelle votre instance de base de données vers une classe d'instance de base de données disposant de plus de mémoire. Notez que la montée en puissance des instances RDS a un impact sur la facturation du compte. Pour en savoir plus, consultez la section Facturation des instances DB pour Amazon RDS.
    Avertissement : un temps d'arrêt se produit lorsque vous modifiez une instance de base de données Amazon RDS.

Suivez le bonnes pratiques pour la configuration du paramètre max_connections

Veillez à prendre en compte les bonnes pratiques suivantes lorsque vous utilisez le paramètre max_connections pour votre instance de base de données :

  • Les limites de connexion par défaut sont réglées pour les systèmes qui utilisent les valeurs par défaut pour d'autres grands consommateurs de mémoire, tels que le groupe tampon. Il est recommandé d'augmenter la classe d'instance, au lieu de modifier la valeur de la classe d'instance. Toutefois, si vos instances ont beaucoup de mémoire libre, vous pouvez modifier manuellement ce paramètre. Avant de modifier ces paramètres pour votre instance de base de données, pensez à ajuster la limite de connexion pour tenir compte de l'augmentation ou de la diminution de la mémoire disponible sur les instances de base de données.
  • Définissez max_connections à une valeur légèrement supérieure au nombre maximal de connexions que vous comptez ouvrir sur chaque instance de base de données.
  • Pour une instance RDS for MySQL, si vous avez activé Performance Schema, portez une attention particulière au paramètre max_connections. Les structures de mémoire de type Performance Schema sont dimensionnées automatiquement en fonction des variables de configuration du serveur. Plus la valeur de cette variable est élevée, plus la mémoire utilisée par Performance Schema est importante. Dans les cas extrêmes, cette condition peut entraîner des problèmes d'insuffisance de la mémoire sur les types d'instances plus petits, par exemple T2 et T3. Si vous utilisez Performance Schema, il est recommandé de conserver la valeur par défaut du paramètre max_connections. Si vous envisagez d'augmenter la valeur max_connections (jusqu'à une valeur nettement supérieure à la valeur par défaut), pensez à désactiver Performance Schema.
    Remarque : si vous activez Performance Insights pour une instance de base de données Amazon RDS for MySQL, Performance Schema est alors automatiquement activé.
  • Pour une instance RDS for MySQL, lorsque vous réglez le paramètre max_connections, veillez à vérifier les paramètres de connexion MySQL suivants : wait_timeout : nombre de secondes pendant lesquelles le serveur attend une activité sur une connexion TCP/IP ou Unix File non interactive avant de fermer la connexion
    interactive_timeout : nombre de secondes pendant lesquelles le serveur attend l'activité sur une connexion interactive avant de la fermer
    net_read_timeout : nombre de secondes d'attente d'une quantité plus importante de données provenant d'une connexion TCP/IP avant l'abandon de la lecture
    net_write_timeout : nombre de secondes d'attente sur les connexions TCP/IP pour qu'un bloc soit écrit avant l'abandon de l'activité d'écriture
    max_execution_time : délai d'expiration de l'exécution pour les instructions SELECT, en milliseconde
    max_connect_errors : un hôte est privé d'autres connexions si la quantité de connexions interrompues dépasse ce nombre
    max_user_connections : nombre maximal de connexions simultanées autorisées sur un compte MySQL donné
  • Pour une instance RDS for PostgreSQL, lorsque vous réglez le paramètre max_connections, assurez-vous également de passer en revue les paramètres de connexion PostgreSQL suivants :
    idle_in_transaction_session_timeout : met fin à toute session avec une transaction ouverte qui est restée inactive pendant plus longtemps que la durée spécifiée en millisecondes. Cela permet de libérer tous les verrous détenus par cette session et de réutiliser l'emplacement de connexion. En outre, les lignes visibles uniquement pour cette transaction sont vidées (vacuum).
    tcp_keepalives_idle : nombre de secondes d'inactivité après lesquelles le système d'exploitation envoie un message TCP keepalive au client
    tcp_keepalives_interval : nombre de secondes après lesquelles un message TCP keepalive dont le client n'a pas accusé réception est transmis à nouveau
    tcp_keepalives_count : nombre de TCP keepalive qui peuvent être perdus avant que la connexion du serveur au client ne soit considérée comme morte.

Remarque : cet article n'inclut pas les valeurs recommandées pour les paramètres répertoriés, car ces valeurs varient en fonction de votre cas d'utilisation.