Maximale MySQL-Speichernutzung


111

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?


4
MySQL "beansprucht nicht für jede neue Abfrage Speicher und läuft schließlich aus". Die Speichernutzung ist viel komplexer.
Rick James

Antworten:


183

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:

  • Tischmaschine ( InnoDB, MyISAM, ...)
  • Größe
  • Indizes
  • Verwendung

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_connectionVariable zu verbessern - nun, wenig wissen sie, dass dies auch impliziert, dass MySQL mehr Ressourcen zuweist, um diese zu bedienen max_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 verringern wait_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- MyISAMTisch, der ihre gesamte Anwendung blockiert und blockiert.

Ich will damit nicht sagen, dass MyISAM scheiße ist, InnoDBkann aber so angepasst werden, dass es fast oder fast so schnell reagiert wie MyISAMund bietet so etwas wie das Sperren von Zeilen, UPDATEwährend MyISAMdie 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, genannt XtraDB.

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 MySQL EXPLAINwirklich begrenzt ist, aber es ist ein Anfang.

Vorgeschlagene Konfigurationen

Über diese my-large.cnfund my-medium.cnfDateien - 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 VARIABLESund SHOW STATUSin 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 .


Ich weiß nicht tuning primer, wie ist es im Vergleich zu mysqltuner?
Greg0ire

38

Wir verwenden diese Einstellungen:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

für einen Server mit folgenden Spezifikationen:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
Ich denke, Sie (und der Autor, auf den Sie verlinken) haben query_cache_size und query_cache_limit falsch herum. Sie sagen MySQL: Ordnen Sie einen 1-MB-Cache zu, aber stellen Sie keine Abfragen darin, die größer als 128 MB sind. dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

Ich würde max_connections senken. Ich würde entscheiden, welchen Motor ich verwenden möchte, und nicht viel Platz für beide reservieren.
Rick James

19

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.inisind:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

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:

table_cache

Ist jetzt:

table_open_cache

2
Hallo! Danke für deine Antwort. Ich habe festgestellt, dass die Gleichung, die die Leute zitieren, die folgende ist: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Gesamtspeicher. Ich habe Folgendes festgelegt: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120 und der Gesamtspeicher auf dem Server beträgt 512M. Nach vielen Abfragen ist der freie Speicher jedoch auf 12 Millionen gesunken und würde bei weiterer Nutzung wahrscheinlich weiter sinken. Gibt es einen Grund, warum dies so ist und kann es verhindert werden? Vielen Dank!

Oder muss ich möglicherweise nicht den Gesamtspeicher auf dem Server (512 MB) berücksichtigen, sondern den freien Speicher (dh den Speicher, der nach dem Laden aller betriebssystembezogenen und anderen Programme verfügbar ist)?

1
Wenn Sie tmp_table_size ändern möchten, um die Größe der temporären Tabellen zu erhöhen, die im RAM gespeichert werden können, müssen Sie auch die max_heap_table_size erhöhen, da MySQL das Minimum der beiden verwendet ...
Dave Rix

1
@ TimothyMilsud - Keine solche Formel funktioniert wirklich. Und die meisten Server laufen einwandfrei, wenn eine Formel behauptet, dass zu viel RAM verwendet wird.
Rick James

19

mysqld.exe verwendete 480 MB im RAM. Ich habe festgestellt, dass ich diesen Parameter zu my.ini hinzugefügt habe

table_definition_cache = 400

Dadurch wurde die Speichernutzung von über 400.000 KB auf 105.000 KB reduziert


Unter welchen Abschnitt fällt das? Ich fügte es meinem hinzu und der Dienst weigerte sich zu starten.
Syntaxfehler

Trotzdem habe ich es unter [wampmysqld] verschoben und es hat großartig funktioniert und den von mir verwendeten Speicher erheblich reduziert. Ich denke, es hat möglicherweise auch meine lokalen Host-Pageloads beschleunigt, sie scheinen jetzt schneller zu sein.
Syntaxfehler

Obwohl die Standardeinstellung und das Minimum 400 sind, was hat es in Ihrem Fall höher als 400 gebracht?
Wadih M.

4

in /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

Gute Arbeit am Server mit 256 MB Speicher.


Warum ist das table_definition_cache= 0? Eine Erklärung wäre schön. Und Sie zwischenspeichern im Grunde keine Abfragen ... der gleiche Effekt, wenn Sie query_cache_type = 0:)
Khom Nazid

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.