Comment résoudre les problèmes de faible quantité de mémoire libérable dans une base de données Amazon RDS for MySQL ou MariaDB ?

Date de la dernière mise à jour : 30/04/2019

J'exécute une instance MariaDB ou MySQL Amazon RDS (Amazon Relational Database Service). Je constate que la quantité de mémoire disponible est faible, que la base de données n'a plus de mémoire ou que la faible quantité de mémoire provoque des problèmes de latence dans l'application. Comment identifier la source de l'utilisation de la mémoire et résoudre les problèmes de faible quantité de mémoire libérable ?

Brève description

MySQL alloue des tampons et de la mémoire cache pour exécuter les opérations de base de données. Pour plus d'informations, consultez la section Comment MySQL utilise-t-il la mémoire dans la documentation MySQL. Lorsque vous utilisez Amazon RDS, 80 % à 90 % de la mémoire disponible sur une instance sont alloués avec les paramètres par défaut. Cette allocation est optimale pour les performances, mais si vous définissez des paramètres qui utilisent plus de mémoire, modifiez alors les autres paramètres pour utiliser moins de mémoire afin de compenser. Une fois que vous avez identifié les composants qui utilisent de la mémoire, vous pouvez rechercher les goulots d'étranglement au niveau de l'instance et de la base de données. Ensuite, vous pouvez configurer les sessions pour optimiser les performances. 

Résolution

Comprendre comment MySQL utilise la mémoire

Les tampons et caches globaux incluent des composants tels que Innodb_buffer_pool_size, Innodb_log_buffer_size, key_buffer_size et query_cache_size. Par défaut, le composant innodb_buffer_pool_size utilise 75 % de la mémoire d'une instance de base de données RDS. Vérifiez ce paramètre d'abord pour identifier la source de l'utilisation de la mémoire. Ensuite, réduisez la valeur du composant innodb_buffer_pool_size. Par exemple, la valeur par défaut DBInstanceClassMemory*3/4 peut être réduite à *5/8 ou *1/2. Veillez à vérifier le paramètre BufferCacheHitRatio de l'instance pour vous assurer que le rapport n'est pas trop bas. Si la valeur du paramètre BufferCacheHitRatio est basse, il peut être nécessaire d'augmenter la taille de l'instance afin de disposer d'une plus grande quantité de mémoire RAM. Pour plus d'informations, consultez Meilleures pratiques de configuration des paramètres pour Amazon RDS for MySQL, partie 1 : paramètres liés aux performances.

De la mémoire est également allouée pour chaque thread MySQL connecté à une instance de base de données MySQL. Les threads suivants nécessitent de la mémoire allouée :

  • thread_stack
  • net_buffer_length
  • read_buffer_size
  • sort_buffer_size
  • join_buffer_size
  • max_heap_table_size
  • tmp_table_size

De plus, MySQL crée des tables temporaires internes pour effectuer certaines opérations. Ces tables sont créées initialement en tant que tables basées sur la mémoire. Lorsque la taille de ces tables atteint la valeur spécifiée par tmp_table_size ou max_heap_table_size (selon le paramètre qui a la valeur la plus basse), la table est convertie en table basée sur un disque. Lorsque plusieurs sessions créent des tables temporaires internes, il est possible que vous constatiez une augmentation de l'utilisation de la mémoire. Pour réduire l'utilisation de la mémoire, évitez d'utiliser des tables temporaires dans les requêtes.

Vous pouvez également constater une augmentation de l'utilisation de la mémoire si plusieurs tampons de même type, comme join_buffer_size ou sort_buffer_size, sont alloués lorsque la session exécute des opérations JOIN (JOINDRE) ou SORT (TRIER). Par exemple, MySQL alloue un tampon JOIN (JOINDRE) pour exécuter une opération JOIN (JOINDRE) entre deux tables. Si une requête implique des opérations JOIN (JOINDRE) sur plusieurs tables et que toutes les requêtes nécessitent un tampon JOIN (JOINDRE), MySQL alloue un tampon JOIN (JOINDRE) de moins que le nombre total de tables. La définition des variables de session avec une valeur trop élevée peut entraîner des problèmes si les requêtes ne sont pas optimisées. Vous pouvez allouer la mémoire minimale aux variables au niveau de la session, telles que join_buffer_size et sort_buffer_size. Pour plus d'informations, consultez Utilisation des groupes de paramètres de base de données.

Si vous effectuez des insertions en bloc pour les tables MYISAM, bulk_insert_buffer_size octets de mémoire sont utilisés. Pour plus d'informations, consultez Meilleures pratiques d'utilisation des moteurs de stockage MySQL.

De la mémoire peut être consommée par le schéma des performances si vous avez activé le schéma des performances pour l’Analyse des performances sur Amazon RDS for MySQL. Lorsque le schéma des performances est activé, MySQL alloue des tampons internes lorsque l'instance est démarrée et pendant les opérations de serveur. Pour plus d'informations sur la façon dont le schéma des performances utilise la mémoire, consultez la section Modèle d'allocation de mémoire du schéma des performances dans la documentation MySQL.

Surveillance et résolution des problèmes d'utilisation de la mémoire sur votre instance

Surveillez les métriques Amazon CloudWatch pour DatabaseConnections, CPUUtilization, ReadIOPS et WriteIOPS lorsque la quantité de mémoire disponible est faible. Pour rechercher la pression sur la mémoire, surveillez les métriques CloudWatch pour SwapUsage en plus de FreeableMemory. Si vous constatez qu'une grande quantité de l'espace d'échange est utilisé et que la quantité de mémoire libérable (FreeableMemory) est faible, il se peut que l'instance de base de données connaisse une pression sur la mémoire, ce qui peut dégrader les performances. Pour plus d'informations, consultez Pourquoi mon instance Amazon RDS utilise-t-elle l'espace d'échange alors que je dispose d'une quantité de mémoire suffisante ?

Pour surveiller l'utilisation des ressources sur une instance de base de données, activez Enhanced Monitoring (surveillance améliorée). Ensuite, définissez une granularité d'une ou de cinq secondes (la valeur par défaut est de 60 secondes).

Exécutez SHOW FULL PROCESSLIST ; (AFFICHER LA LISTE COMPLÈTE DES PROCESSUS) pour afficher toutes les connexions ouvertes. Ensuite, exécutez la commande SHOW ENGINE INNODB STATUS ; (AFFICHER LE STATUT INNODB DU MOTEUR) pour afficher les informations InnoDB, telles que les transactions à longue exécution, les statistiques d'utilisation de la mémoire et les verrous. Vérifiez la section BUFFER POOL AND MEMORY (POOL TAMPON ET MÉMOIRE) pour déterminer s'il existe des pages libres.

Enfin, activez Analyse des performances afin d'identifier les requêtes qui consomment de la mémoire. Ensuite, définissez une alarme CloudWatch sur la métrique FreeableMemory pour recevoir une notification lorsque la mémoire disponible diminue. Il est recommandé de conserver au moins 5 % de la mémoire d'instance libre. Par conséquent, définissez une alarme CloudWatch qui vous informe lorsque l'utilisation atteint 95 %.

Vous pouvez utiliser les tables de mémoire du schéma des performances pour surveiller l'utilisation de la mémoire. Vous pouvez également utiliser sys schema MySQL pour les vues simplifiées à utiliser en association avec les tables du schéma des performances. Par exemple, vous pouvez utiliser l'événement performance_schema pour afficher la quantité de mémoire allouée pour les tampons internes qui sont utilisés par le schéma des performances. Ou bien, vous pouvez exécuter une requête similaire à celle ci-dessous pour identifier la quantité de mémoire allouée :

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';

Les instruments de mémoire sont répertoriés dans la table setup_instruments. Ces instruments portent un nom basé sur memory/code_area/instrument_name, par exemple, memory/innodb/buf_buf_pool. Pour activer l'instrumentalisation de la mémoire, mettez à jour la colonne ENABLED (ACTIVÉ) des instruments appropriés dans la table setup_instruments :

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';

Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?