18 votes

MySQL : Comment réduire l'utilisation maximale possible de la mémoire ?

J'ai récemment eu des problèmes de plantage suite à un manque de mémoire. (Mon VPS a 256M au total)

J'essaie de régler MySQL à l'aide de mysqltuner.pl, et j'obtiens les résultats suivants :

\-------- General Statistics --------------------------------------------------
\[--\] Skipped version check for MySQLTuner script
\[OK\] Currently running supported MySQL version 5.0.51a-3ubuntu5.4-log
\[OK\] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
\[--\] Status: +Archive -BDB -Federated -InnoDB -ISAM -NDBCluster 
\[--\] Data in MyISAM tables: 114M (Tables: 454)
\[!!\] Total fragmented tables: 34

-------- Performance Metrics -------------------------------------------------
\[--\] Up for: 40s (570 q \[14.250 qps\], 23 conn, TX: 154K, RX: 23K)
\[--\] Reads / Writes: 100% / 0%
\[--\] Total buffers: 338.0M global + 2.7M per thread (20 max threads)
\[!!\] Maximum possible memory usage: 392.9M (153% of installed RAM)
\[OK\] Slow queries: 0% (5/570)
\[OK\] Highest usage of available connections: 15% (3/20)
\[!!\] Key buffer size / total MyISAM indexes: 8.0M/9.4M
\[!!\] Key buffer hit rate: 57.1% (7 cached / 3 reads)
\[OK\] Query cache efficiency: 21.9% (7 cached / 32 selects)
\[OK\] Query cache prunes per day: 0
\[OK\] Sorts requiring temporary tables: 0% (0 temp sorts / 1 sorts)
\[OK\] Temporary tables created on disk: 0% (0 on disk / 32 total)
\[OK\] Thread cache hit rate: 86% (3 created / 23 connections)
\[OK\] Table cache hit rate: 26% (128 open / 484 opened)
\[OK\] Open file limit used: 25% (259/1K)
\[OK\] Table locks acquired immediately: 100% (492 immediate / 492 locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
Variables to adjust:
  \*\*\* MySQL's maximum memory usage is dangerously high \*\*\*
  \*\*\* Add RAM before increasing MySQL buffer variables \*\*\*
    key\_buffer\_size (> 9.4M)

Mais je suis un peu confus sur la façon de réduire l'utilisation maximale de la mémoire ? Il semble qu'elle soit basée sur key_buffer et max_connections, mais il doit y avoir autre chose d'impliqué aussi ?

mon.cnf :

key\_buffer              = 8M
max\_allowed\_packet      = 12M
thread\_stack            = 128K
thread\_cache\_size       = 8
max\_connections         = 20
table\_cache             = 128
tmp\_table\_size          = 256M
max\_heap\_table\_size     = 256M
join\_buffer\_size        = 256K
query\_cache\_limit       = 8M
query\_cache\_size        = 64M

J'ai essayé de lire des articles sur le réglage de MySQL, mais ils semblent destinés à des personnes qui savent déjà ce qu'elles font ! Toute aide serait la bienvenue. Merci.

11voto

Vous disposez d'un serveur de 256M, mais vous ne pouvez pas tout utiliser - n'oubliez pas qu'il y a des frais généraux de système d'exploitation. Ajoutez à cela le fait que vous vous engagez trop, comme d'autres personnes l'ont mentionné, et vous aurez certainement des problèmes ici. 256M est seulement suffisant pour une petite base de données, 20 connexions est beaucoup avec ce que vous avez configuré.

1) réduisez vos connexions maximales à 4 (vous en utilisez 3 sur 20)

2) optimisez mieux votre cache de requête ; 8M est vraiment grand, et 64M total est beaucoup basé sur vos hits/prunes ; essayez un combo 4/32 et voyez comment ça se passe. Je pense vraiment qu'une combinaison 2/24 vous conviendrait.

3) vous n'avez pas de tris nécessitant des tables temporaires, pourquoi ce verbe max_heap_table_size est-il présent ? Commentez-le, utilisez les valeurs par défaut

4) avez-vous réellement 128 tables ? Essayez de réduire de moitié la table_cache à 64 ou 48.

5) réduire thread_cache_size à 4

6) optimiser ces tables pour réduire la fragmentation

Ce sont des choses avec lesquelles il faut commencer. Il semble que vous ayez jeté un tas de chiffres dans une configuration sans aucun profilage réel pour savoir ce dont vous aviez besoin et que vous ayez créé un désordre ; si tout le reste échoue, revenez aux valeurs par défaut et supprimez vos paramètres personnalisés et recommencez en utilisant des guides d'optimisation des performances que vous pouvez trouver sur Google. Obtenez la sortie de SHOW VARIABLES et SHOW STATUS, trouvez n'importe lequel des milliards de guides d'optimisation et insérez vos chiffres réels dans leurs équations et vous obtiendrez les chiffres exacts que vous devez mettre dans votre fichier de configuration.

9voto

Sean Points 167

Je ne suis pas un gourou de MySQL et je ne peux pas diagnostiquer le problème avec ces informations, mais j'ai essayé de rechercher la formule dans le code source. La voici :

server_buffers + total_per_thread_buffers * max_connections

Où :

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

et :

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

Vous devez maintenant vérifier chacune de ces valeurs et déterminer laquelle est responsable de ce chiffre énorme. Et ne faites pas confiance à ce script sans réserve - j'ai essayé de l'exécuter sur l'un de mes serveurs DB et il a calculé que la mémoire maximale est de 140% de la quantité totale de mémoire physique, mais le système fonctionne depuis des années sans aucun problème de stabilité.

Bonne chance !

1voto

gekkz Points 4209

Si je me souviens bien, MySQL Tuner utilise la formule suivante pour estimer l'utilisation maximale :

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Gardez à l'esprit que ce n'est pas 100% correct, et qu'il s'agit en fait d'une estimation, car certains paramètres de MySQL n'ont pas de limite définie.

Vous pouvez commencer à atténuer certains des paramètres de votre fichier de configuration et relancer le tuner, mais je vous conseille de demander l'aide d'un expert si vous n'avez pas le temps de modifier my.cnf, de le redémarrer et de relancer le tuner.

0voto

Wilson Hauck Points 306

L'utilisation du logiciel mysqlcalculator.com peut vous faire gagner de nombreuses heures.

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