Ich möchte wissen, wie es möglich ist, eine Obergrenze für die Speichermenge festzulegen, die MySQL auf einem Linux-Server verwendet.
Im Moment belegt MySQL bei jeder neuen angeforderten Abfrage weiterhin Speicherplatz, sodass schließlich nicht mehr genügend Arbeitsspeicher zur Verfügung steht. Gibt es eine Möglichkeit, ein Limit festzulegen, damit MySQL nicht mehr als diesen Betrag verwendet?
Antworten:
Die maximale Speichernutzung von MySQL hängt stark von der Hardware, Ihren Einstellungen und der Datenbank selbst ab.
Hardware
Die Hardware ist der offensichtliche Teil. Je mehr RAM desto besser, desto schneller sind die Festplatten . Glauben Sie diesen monatlichen oder wöchentlichen Newslettern jedoch nicht. MySQL skaliert nicht linear - auch nicht auf Oracle-Hardware. Es ist etwas kniffliger.
Das Fazit lautet: Es gibt keine allgemeine Faustregel für die Empfehlungen für Ihr MySQL-Setup. Es hängt alles von der aktuellen Nutzung oder den Projektionen ab.
Einstellungen & Datenbank
MySQL bietet unzählige Variablen und Schalter, um sein Verhalten zu optimieren. Wenn Sie auf Probleme stoßen, müssen Sie sich wirklich hinsetzen und das (f'ing) Handbuch lesen.
Was die Datenbank betrifft - einige wichtige Einschränkungen:
InnoDB
,MyISAM
, ...)Die meisten MySQL-Tipps zum Stackoverflow enthalten Informationen zu 5-8 sogenannten wichtigen Einstellungen. Zunächst einmal sind nicht alle von Bedeutung - z. B. die Zuweisung vieler Ressourcen zu InnoDB und die Nichtverwendung von InnoDB macht wenig Sinn, da diese Ressourcen verschwendet werden.
Oder - viele Leute schlagen vor, die
max_connection
Variable zu verbessern - nun, wenig wissen sie, dass dies auch impliziert, dass MySQL mehr Ressourcen zuweist, um diese zu bedienenmax_connections
- falls dies jemals benötigt wird. Die naheliegendere Lösung könnte darin bestehen, die Datenbankverbindung in Ihrer DBAL zu schließen oder die zu verringernwait_timeout
, um diese Threads freizugeben.Wenn Sie meinen Drift bemerken, gibt es wirklich viel zu lesen und zu lernen.
Motoren
Tisch-Engines sind eine ziemlich wichtige Entscheidung. Viele Menschen vergessen diese frühzeitig und kämpfen plötzlich mit einem 30-GB-
MyISAM
Tisch, der ihre gesamte Anwendung blockiert und blockiert.Ich will damit nicht sagen, dass MyISAM scheiße ist,
InnoDB
kann aber so angepasst werden, dass es fast oder fast so schnell reagiert wieMyISAM
und bietet so etwas wie das Sperren von Zeilen,UPDATE
währendMyISAM
die gesamte Tabelle beim Schreiben gesperrt wird.Wenn Sie MySQL auf Ihrer eigenen Infrastruktur ausführen können, sollten Sie auch den Percona-Server überprüfen, da er neben vielen Beiträgen von Unternehmen wie Facebook und Google (sie wissen es schnell) auch Perconas eigenen Drop-Server enthält. als Ersatz für
InnoDB
, genanntXtraDB
.Informationen zur Einrichtung des Percona-Servers (und des Clients) (unter Ubuntu) finden Sie in meiner Liste: http://gist.github.com/637669
Größe
Die Datenbankgröße ist sehr, sehr wichtig - ob Sie es glauben oder nicht, die meisten Leute in den Intarwebs haben noch nie ein großes und schreibintensives MySQL-Setup durchgeführt, aber diese existieren wirklich. Einige Leute werden trollen und etwas sagen wie "Use PostgreSQL !!! 111", aber lassen Sie uns sie vorerst ignorieren.
Das Fazit lautet: Ausgehend von der Größe muss eine Entscheidung über die Hardware getroffen werden. Sie können eine 80-GB-Datenbank mit 1 GB RAM nicht wirklich schnell ausführen.
Indizes
Es ist nicht: je mehr, desto besser. Es müssen nur die benötigten Indizes festgelegt und die Verwendung überprüft werden
EXPLAIN
. Hinzu kommt, dass MySQLEXPLAIN
wirklich begrenzt ist, aber es ist ein Anfang.Vorgeschlagene Konfigurationen
Über diese
my-large.cnf
undmy-medium.cnf
Dateien - ich weiß nicht einmal, für wen diese geschrieben wurden. Roll deinen eigenen.Primer einstellen
Ein guter Anfang ist der Tuning Primer . Es ist ein Bash-Skript (Hinweis: Sie benötigen Linux), das die Ausgabe von
SHOW VARIABLES
undSHOW STATUS
in eine hoffentlich nützliche Empfehlung umschließt. Wenn Ihr Server einige Zeit ausgeführt wurde, ist die Empfehlung besser, da Daten vorhanden sind, auf denen sie basieren können.Der Tuning Primer ist jedoch keine magische Sauce. Sie sollten immer noch alle Variablen nachlesen, die geändert werden sollen.
lesen
Ich kann den mysqlperformanceblog sehr empfehlen . Es ist eine großartige Ressource für alle Arten von MySQL-bezogenen Tipps. Und es ist nicht nur MySQL, sie wissen auch viel über die richtige Hardware oder empfehlen Setups für AWS usw. Diese Leute haben jahrelange Erfahrung.
Eine weitere großartige Ressource ist natürlich planet-mysql .
quelle
tuning primer
, wie ist es im Vergleich zumysqltuner
?Wir verwenden diese Einstellungen:
für einen Server mit folgenden Spezifikationen:
quelle
Die Nutzung des Datenbankspeichers ist ein komplexes Thema. Der MySQL Performance Blog deckt Ihre Frage gut ab und listet viele Gründe auf, warum es äußerst unpraktisch ist, Speicher zu "reservieren".
Wenn Sie wirklich ein hartes Limit festlegen möchten, können Sie dies tun, müssen dies jedoch auf Betriebssystemebene tun, da keine integrierte Einstellung vorhanden ist. Unter Linux könnten Sie ulimit verwenden , aber Sie müssten wahrscheinlich die Art und Weise ändern, wie MySQL startet, um dies durchzusetzen .
Die beste Lösung besteht darin, Ihren Server herunterzufahren, damit eine Kombination der üblichen MySQL-Speichereinstellungen zu einer allgemein geringeren Speichernutzung durch Ihre MySQL-Installation führt. Dies wirkt sich natürlich negativ auf die Leistung Ihrer Datenbank aus, aber einige der Einstellungen, die Sie anpassen können,
my.ini
sind:Ich würde dort anfangen und sehen, ob Sie die gewünschten Ergebnisse erzielen können. Es gibt viele Artikel über das Anpassen der MySQL-Speichereinstellungen.
Bearbeiten:
Beachten Sie, dass sich einige Variablennamen in den neueren 5.1.x-Versionen von MySQL geändert haben .
Beispielsweise:
Ist jetzt:
quelle
mysqld.exe verwendete 480 MB im RAM. Ich habe festgestellt, dass ich diesen Parameter zu my.ini hinzugefügt habe
Dadurch wurde die Speichernutzung von über 400.000 KB auf 105.000 KB reduziert
quelle
in
/etc/my.cnf
:Gute Arbeit am Server mit 256 MB Speicher.
quelle
table_definition_cache
= 0? Eine Erklärung wäre schön. Und Sie zwischenspeichern im Grunde keine Abfragen ... der gleiche Effekt, wenn Siequery_cache_type = 0
:)Wenn Sie Ihren Docker-MySQL-Container optimieren möchten, kann der folgende Befehl hilfreich sein. Ich konnte den MySQL-Docker-Container von standardmäßig 480 MB auf nur 100 MB ausführen
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 --name mysqldb mysql --table_definition_definition_definition_definition_ --performance_schema = 0 --default-authentication-plugin = mysql_native_password
quelle