Je voudrais savoir comment il est possible de fixer une limite supérieure à la quantité de mémoire utilisée par MySQL sur un serveur Linux.
À l'heure actuelle, MySQL continuera à prendre de la mémoire à chaque nouvelle requête demandée, de sorte qu'il finisse par manquer de mémoire. Existe-t-il un moyen de placer une limite pour que MySQL n'utilise pas plus de ce montant?
Réponses:
L'utilisation maximale de la mémoire de MySQL dépend beaucoup du matériel, de vos paramètres et de la base de données elle-même.
Matériel
Le matériel est la partie évidente. Plus il y a de RAM, plus les disques sont fous, plus rapides sont les ftw . Ne croyez pas ces lettres d'information mensuelles ou hebdomadaires. MySQL ne s'adapte pas de manière linéaire, même pas sur le matériel Oracle. C'est un peu plus compliqué que ça.
L'essentiel est: il n'y a pas de règle générale pour ce qui est recommandé pour votre configuration MySQL. Tout dépend de l'utilisation actuelle ou des projections.
Paramètres et base de données
MySQL propose d'innombrables variables et commutateurs pour optimiser son comportement. Si vous rencontrez des problèmes, vous devez vraiment vous asseoir et lire le manuel (f'ing).
Quant à la base de données - quelques contraintes importantes:
InnoDB
,MyISAM
, ...)La plupart des conseils MySQL sur le stackoverflow vous indiqueront environ 5 à 8 paramètres dits importants. Tout d'abord, ils n'ont pas tous d'importance - par exemple, allouer beaucoup de ressources à InnoDB et ne pas utiliser InnoDB n'a pas beaucoup de sens parce que ces ressources sont gaspillées.
Ou - beaucoup de gens suggèrent d'augmenter la
max_connection
variable - eh bien, ils ne savent pas que cela implique également que MySQL allouera plus de ressources pour répondre à ces besoinsmax_connections
- si jamais nécessaire. La solution la plus évidente peut être de fermer la connexion à la base de données dans votre DBAL ou d'abaisser lewait_timeout
pour libérer ces threads.Si vous comprenez ma dérive - il y a vraiment beaucoup, beaucoup de choses à lire et à apprendre.
Moteurs
Les moteurs de table sont une décision assez importante, beaucoup de gens les oublient très tôt et se retrouvent soudainement à se battre avec une
MyISAM
table de 30 Go qui verrouille et bloque toute leur application.Je ne veux pas dire que MyISAM est nul , mais
InnoDB
peut être modifié pour répondre presque ou presque aussi vite queMyISAM
et offre des choses telles que le verrouillage de ligneUPDATE
alors queMyISAM
verrouille toute la table lorsqu'elle est écrite.Si vous êtes libre d'exécuter MySQL sur votre propre infrastructure, vous voudrez peut-être également consulter le serveur percona, car parmi les nombreuses contributions d'entreprises comme Facebook et Google (elles savent rapidement), il inclut également la propre goutte de Percona. en remplacement de
InnoDB
, appeléXtraDB
.Voir mon essentiel pour la configuration du serveur percona (et du client) (sur Ubuntu): http://gist.github.com/637669
Taille
La taille de la base de données est très, très importante - croyez-le ou non, la plupart des utilisateurs d'Intarwebs n'ont jamais manipulé une configuration MySQL volumineuse et intense, mais celles-ci existent vraiment. Certaines personnes vont troller et dire quelque chose comme «Utilisez PostgreSQL! 111», mais ignorons-les pour le moment.
L'essentiel est: à en juger par la taille, la décision concernant le matériel doit être prise. Vous ne pouvez pas vraiment faire fonctionner une base de données de 80 Go rapidement sur 1 Go de RAM.
Les indices
Ce n'est pas: plus on est de fous. Seuls les indices nécessaires doivent être définis et l'utilisation doit être vérifiée avec
EXPLAIN
. Ajoutez à cela que MySQLEXPLAIN
est vraiment limité, mais c'est un début.Configurations suggérées
À propos de ceux-ci
my-large.cnf
et desmy-medium.cnf
fichiers - je ne sais même pas pour qui ils ont été écrits. Roulez le vôtre.Apprêt de réglage
Un bon début est l' amorce de réglage . C'est un script bash (indice: vous aurez besoin de linux) qui prend la sortie de
SHOW VARIABLES
etSHOW STATUS
et l'enveloppe dans une recommandation, espérons-le utile. Si votre serveur a fonctionné un certain temps, la recommandation sera meilleure car il y aura des données sur lesquelles les baser.Cependant, l'amorce d'accord n'est pas une sauce magique. Vous devriez toujours lire toutes les variables qu'il suggère de changer.
En train de lire
J'aime vraiment recommander le mysqlperformanceblog . C'est une excellente ressource pour toutes sortes de conseils liés à MySQL. Et ce n'est pas seulement MySQL, ils en savent aussi beaucoup sur le bon matériel ou recommandent des configurations pour AWS, etc. Ces types ont des années et des années d'expérience.
Une autre excellente ressource est , bien sûr, planet-mysql .
la source
tuning primer
, comment ça se comparemysqltuner
?Nous utilisons ces paramètres:
pour un serveur avec les spécifications suivantes:
la source
L'utilisation de la mémoire de la base de données est un sujet complexe. Le blog des performances MySQL fait un bon travail pour couvrir votre question et énumère de nombreuses raisons pour lesquelles il est extrêmement peu pratique de «réserver» de la mémoire.
Si vous voulez vraiment imposer une limite stricte, vous pouvez le faire, mais vous devrez le faire au niveau du système d'exploitation car il n'y a pas de paramètre intégré. Sous Linux, vous pouvez utiliser ulimit , mais vous devrez probablement modifier la façon dont MySQL démarre pour l'imposer.
La meilleure solution est de régler votre serveur, de sorte qu'une combinaison des paramètres habituels de la mémoire MySQL se traduise par une utilisation de la mémoire généralement inférieure par votre installation MySQL. Cela aura bien sûr un impact négatif sur les performances de votre base de données, mais certains des paramètres que vous pouvez modifier
my.ini
sont:Je commencerais par là et voir si vous pouvez obtenir les résultats que vous souhaitez. Il existe de nombreux articles sur l'ajustement des paramètres de mémoire MySQL.
Éditer:
Notez que certains noms de variables ont changé dans les nouvelles versions 5.1.x de MySQL .
Par exemple:
Est maintenant:
la source
mysqld.exe utilisait 480 Mo de RAM. J'ai trouvé que j'ai ajouté ce paramètre à my.ini
qui a réduit l'utilisation de la mémoire de plus de 400 000 Ko à 105 000 Ko
la source
dans
/etc/my.cnf
:Bon travail sur serveur avec 256 Mo de mémoire.
la source
table_definition_cache
= 0? Une explication serait bien. Et en gros, vous ne mettez pas en cache les requêtes ... même effet si vousquery_cache_type = 0
:)Si vous cherchez à optimiser votre conteneur docker mysql, la commande ci-dessous peut vous aider. J'ai pu exécuter le conteneur de docker mysql à partir d'un 480 Mo par défaut à seulement 100 Mo
docker run -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql - mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password
la source