Wie können Sie MySQL für eine hohe Auslastung von InnoDB optimieren?

39

Annahme eines Produktions-OLTP-Systems mit überwiegend InnoDB-Tabellen

  • Was sind die häufigsten Symptome eines falsch konfigurierten Systems?
  • Welche Konfigurationsparameter ändern Sie am häufigsten von ihren Standardeinstellungen?
  • Wie können Sie mögliche Engpässe erkennen, bevor es ein Problem gibt?
  • Wie erkennen und beheben Sie aktive Probleme?

Anekdoten, die spezifische statusVariablen und Diagnosen beschreiben, sind willkommen.

Riedsio
quelle
2
Diese Frage ist furchtbar weit. Kannst du es in 4 Fragen aufteilen? (Und selbst Ihre Fragen mit Aufzählungszeichen sind unglaublich umfangreich. Können Sie sie mit Ihren spezifischen Problemen in Verbindung bringen?)
Brian Ballsun-Stanton

Antworten:

16

Hier ist ein guter Artikel über InnoDB-Optimierung von Suns Jenny Chen - sie bloggt viel über MySQL, einige davon sind Solaris-spezifisch (z. B. mit DTrace ), aber der gesamte Blog steckt voller interessanter Leckerbissen.

Gaius
quelle
4
Wer ist Jenny Chen?
Pacerier
19

Interessanterweise können Sie in MySQL 5.5 jetzt mehrere innodb-Pufferpools haben.

Die Parameter, die Sie interessieren, sind

In ungefähr einem Monat soll ich 112 Innodb-Pufferpools für einen Client implementieren. Ich werde dich wissen lassen, wie es gelaufen ist.

UPDATE 2011-02-27 21:57 EDT

Ich habe herausgefunden, dass der maximale Wert für innodb_buffer_pool_instances 64 ist. Ich habe mich entschieden, 144 GB zu konfigurieren. Daher habe ich innodb_buffer_pool_instances auf 18 und innodb_buffer_pool_size auf 8 gesetzt. Ich lade derzeit den Server mit 450 GB

UPDATE 2011-04-28 13:44 EDT

Ich habe mehrere InnoDB Buffer Pools ausprobiert. Es gab zu viel Threading Locking und Streit. Ich habe auf einen einzigen 162-GB-Pufferpool umgestellt und read_io_threads und write_io_threads auf 64 (Maximalwert) gesetzt. Das hat viel besser funktioniert.

UPDATE 2012-07-03 17:27 EDT

Ich habe etwas Erstaunliches über MySQL gelernt. Wenn Sie einen einzelnen monolithischen InnoDB-Pufferpool zuweisen, der größer ist als die installierte Gesamtmenge geteilt durch die Anzahl der physischen CPUs , wird das Betriebssystem aufgrund eines vollständigen InnoDB-Pufferpools zu einem regelmäßigen Speicheraustausch veranlasst. Die als innodb_buffer_pool_instances bekannte Option von MySQL 5.5 kann verwendet werden, um den Pufferpool aufzuteilen. Gestern habe ich dies für den Kunden, den ich letztes Jahr in meiner Antwort erwähnt habe, richtig implementiert. Ich habe noch 162 GB für den Buffer Pool des Kunden. Ich habe die Option innodb_buffer_pool_instances des Servers auf 2 gesetzt, da jeder DB-Server dual hexacore ist. Ich wollte es auf 12 setzen, aber dann zeigte mir ein Kollege einen Blog von Jeremy Cole über MySQL und Swappiness. Nachdem ich es gelesen habe, setze ich es sofort für meinen Klienten in die Praxis um. Ich habe diesen Befehl ausgeführt

numactl --hardware

Ich sah eine Zuordnung von 192 GB Server-RAM als 96 GB für jeden physischen Kern. Daher habe ich die innodb_buffer_pool_instances auf 2 gesetzt. Im Moment sieht es gut aus. Ich werde meine Antwort aktualisieren, um zu sehen, wie sich dies auf den Speicheraustausch für die nächsten 2 Monate auswirkt.

RolandoMySQLDBA
quelle
hi @RolandoMySQLDBA, in jeremys Blogs kann ich keine Verbindung oder Schlussfolgerung finden, die besagt, dass die Anzahl der physischen CPUs der Innodb-Instanz entspricht, um das Auslagerungsproblem zu lösen. Werden mehrere innodb-Instanzen automatisch zwischen Speicherknoten verteilt, ohne dass numactl --interleave = all festgelegt wird, wodurch die Puffer-Caches von Linux geleert werden oder das Betriebssystem gezwungen wird, den Puffer-Pool von InnoDB zuzuweisen?
Wen Ren
@ Rolando, Nice 2x 100 GB RAM. Welcher Kunde ist das?
Pacerier
Ich dachte, dass "Instanzen" folgendermaßen implementiert wurden: (Blocknummer) MOD (Anzahl Instanzen) -> (in welche Instanz der Block eingefügt werden soll). Das hat nichts mit NUMA zu tun.
Rick James
4

Erhöhen Sie zunächst die Standardgröße des InnoDB-Pufferpools in my.cnf (meiner Meinung nach standardmäßig 8 MB).

Sie sollten dies wahrscheinlich auf 75% Ihrer RAM-Größe einstellen (im Allgemeinen)

Matt Healy
quelle
-1

Welche Konfigurationsparameter ändern Sie am häufigsten von ihren Standardeinstellungen?

Speicherkonfiguration

sbczk
quelle
Können Sie eine erklärendere Antwort geben? Was ist mit ihnen ändern Sie? Warum nehmen Sie diese Änderungen vor? Was sind Ihre erwarteten Beobachtungen nach diesen Änderungen? Woher weißt du, in was du sie ändern sollst?
jcolebrand
Die MySQL-Konfiguration ist sofort einsatzbereit, um MyISAM-Tabellen schnell einzurichten (da die meisten Benutzer sie auf diese Weise verwenden). Um einen gut optimierten Server zu haben, sollten Sie die zu verwendende "primäre" Engine (Innodb oder MySQL) wählen Schwer zu konfigurierende Datenbank für hervorragende Leistung für Stand-Engines, MySQL haben separate Puffer für Myisam und Innodb Engines
sbczk