8 votes

Comment attribuer une limite de mémoire à mySQL ?

Mysql tuner rapporte que mySQL peut utiliser 166% de la RAM installée, comment puis-je limiter l'utilisation de la RAM ?

[Utilisation maximale possible de la mémoire : 426.8M (166% de la RAM installée)

9voto

Adam Points 11

Vous pouvez soit configurer

  • Tous les MyISAM
  • Tout InnoDB
  • Mélange de MyISAM et InnoDB

Avant d'allouer de la mémoire à l'un ou l'autre des moteurs, il est bon de réfléchir à la mise en cache qui va de pair avec chaque moteur de stockage.

Configurer pour MYISAM

Le principal mécanisme utilisé est le cache des clés. Il ne met en cache que les pages d'index des fichiers .MYI. Pour dimensionner votre cache de clés, exécutez la requête suivante :

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Cela donnera le paramètre recommandé pour le cache des clés MyISAM ( taille_du_buffer_clé ) compte tenu de votre ensemble de données actuel ( la requête plafonnera la recommandation à 4G (4096M). Pour les systèmes d'exploitation 32 bits, la limite est de 4 Go. Pour les systèmes 64 bits, 8 Go.

Configurer pour InnoDB

Le principal mécanisme utilisé est le buffer Pool InnoDB. Il met en cache les pages de données et d'index des tables InnoDB auxquelles on accède. Pour dimensionner votre buffer Pool InnoDB, exécutez la requête suivante :

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Cela donnera le paramètre recommandé pour la taille du pool tampon InnoDB ( innodb_buffer_pool_size ) compte tenu de votre ensemble de données actuel.

N'oubliez pas de redimensionner les fichiers journaux InnoDB (ib_logfile0 et ib_logfile1). Le code source de MySQL impose un plafond pour la taille combinée de tous les fichiers journaux InnoDB, qui doit être < 4G (4096M). (NOTE : Les binaires du serveur Percona dépassent cette limite. J'ai récemment configuré un grand serveur DB avec 4G pour un seul fichier journal InnoDB en utilisant innodb_log_file_size )

Pour simplifier, si l'on considère deux fichiers journaux, voici comment les dimensionner :

  • Etape 1) ajouter innodb_log_file_size=NNN à /etc/my.cnf (NNN doit être 25% de innodb_buffer_pool_size ou 2047M, la plus petite valeur étant retenue)
  • Étape 2) service mysql stop
  • Étape 3) rm /var/log/mysql/ib_logfile [01]
  • Etape 4) service mysql start (ib_logfile0 et ib_logfile1 sont recréés)

CAVEAT

À la fin des deux requêtes, il y a une requête en ligne : (SELECT 2 PowerOfTwo) B

  • (SELECT 0 PowerOf1024) donne le paramètre en octets
  • (SELECT 1 PowerOf1024) donne le paramètre en Kilo-octets
  • (SELECT 2 PowerOf1024) donne le paramètre en mégaoctets
  • (SELECT 3 PowerOf1024) donne le paramètre en gigaoctets
  • Aucune puissance inférieure à 0 ou supérieure à 3 n'est acceptée.

EPILOGUE

Il n'y a pas de substitut au bon sens. Si vous disposez d'une mémoire limitée, d'un mélange de moteurs de stockage ou d'une combinaison des deux, vous devrez vous adapter à différents scénarios.

Si vous avez 2GB de RAM et 16GB d'InnoDB, allouez 512M comme innodb_buffer_pool_size .

Si vous avez 2GB de RAM et 4GB d'index MyISAM, allouez 512M en tant que key_buffer_size .

Si vous disposez de 2 Go de RAM, de 4 Go d'index MyISAM et de 16 Go d'index InnoDB, allouez 512 Mo en tant que key_buffer_size et 512M comme innodb_buffer_pool_size .

Les scénarios possibles sont infinis ! !!

N'oubliez pas que, quelle que soit l'allocation, laissez suffisamment de RAM pour les connexions aux bases de données et le système d'exploitation.

3voto

Alex Points 7759

Vous devriez modifier key_buffer_size y innodb_buffer_pool_size dans votre my.cnf Ces deux paramètres sont les plus importants pour la mémoire. Pour obtenir vos valeurs actuelles, utilisez show variables like 'key_buffer_size'; y show variables like 'innodb_buffer_pool_size'; en mysql client en ligne de commande.

3voto

Oskar N. Points 2124

Dans le cas du moteur Myisam

taille_buffer_clé + (taille_buffer_lecture + taille_buffer_tri) *max_connexions

cette valeur donne la mémoire totale possible que mysql peut consommer, ce qui devrait être inférieur à votre RAM ou près de 60 % de la RAM. dans le cas de innodb innodb_buffer_pool_size doit être inférieur à votre RAM ou à 60 % de votre RAM.

Réglez les valeurs ci-dessus, de sorte que l'utilisation de la RAM soit de 60% de votre RAM.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X