Réduire la consommation mémoire d’une instance MySQL pour l’import de données

La mémoire utilisée est un élément important à superviser sur une instance MySQL.
Une surconsommation mémoire peut déclencher l’arrêt de l’instance.

Cet article présente plusieurs solutions pour réduire l’utilisation de la mémoire notamment pendant l’import de données.

 

 

 

 

 

En cas de crash de l’instance, il est conseillé de vérifier que Out-of-Memory (OOM) killer n’est pas responsable de l’arrêt de l’instance.

La consommation mémoire d’une instance MySQL peut être définie de la manière suivante :

Le code suivant permet d’afficher la mémoire utilisée par l’instance :

Exemple de résultat :

Après la mise à jour en version MySQL 5.7 d’une instance avec de nombreuses tables InnoDB, l’utilisation de la mémoire peut être plus élevée.
L’activation de l’instrumentation de mémoire dans le schéma de performances montre que l’utilisation principale de la mémoire provient de l’utilisation du composant memory/innodb/mem0mem :

L’utilisation supérieure de la mémoire avec MySQL 5.7 est principalement due à l’ajout de nouvelles fonctionnalités pour optimiser l’usage des tables temporaires sur disques.
Ce problème est normalement corrigé en version MySQL 5.7.19.

A partir de la version MySQL 5.6, en présence de procédures stockées de plus de 1000 lignes, mysqldump provoque une utilisation excessive de la mémoire lors du vidage des procédures stockées.
MySQL stocke les procédures dans le cache de procédure, qui est un cache alloué par thread. Cela peut utiliser plusieurs dizaines de giga de mémoire.
Dans ce cas, il faut réduire la taille des procédures stockées en factorisant le code (bonnes pratiques).

Par défaut, le client ligne de commande MySQL utilise l’API mysql_store_result qui stocke le « result set » dans une zone mémoire.
Une solution pour réduire la mémoire est d’utiliser le paramètre –quick. Cela force le client MySQL a utiliser l’API mysql_use_result (à la place de mysql_store_result) et d’envoyer le résultat ligne à ligne.

Le cache de requête ajoute une surcharge pour toutes les instructions DML.
Il est possible de désactiver le cache de requêtes pendant l’import pour améliorer les performances.

Pendant l’importation, il est possible de réduire le coût de la validation des transactions (InnoDB Flush Logs).

Cela supprime la propriété D (durabilité) dans ACID, mais cela ne doit pas poser de problème s’il n’y a aucune activité sur la base de données.

Performance Schema peut également consommer une quantité de mémoire non significative.

Pour contrôler la mémoire utilisé par Performance Schema, utiliser la commande suivante :

A partir de la version MySQL 5.7,

Pour désactiver Performance Schema, il faut modifier le fichier d’options, ajouter la ligne suivante et redémarrer l’instance :

 

 

About dummydba

has written 22 post in this blog.

Consultant Oracle chez EASYTEAM

One thought on “Réduire la consommation mémoire d’une instance MySQL pour l’import de données

  1. Bola Emile

    Bonjour,

    Très bel article! Bravo!

    Nous avons également un problème de surconsommation sur notre application Android de messagerie instantanée. Nous utilisons MySQL couplée avec Apache. Notre application utilise les socket io.

    Nous avons tenté votre approche, mais la situation n’a pas changé. Je ne sais pas si vous pouvez nous conseiller.

    Cordialement,

    Reply

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

%d blogueurs aiment cette page :