Beste MySQL-Cache-Einstellungen für 8 GB RAM dedizierten MySQL-Server mit nur InnoDB (5 GB Datenbank)

20

Ich bin ein ziemlich großer Neuling, wenn es darum geht, MySQL für die Leistung zu konfigurieren. Und ehrlich gesagt mache ich mir keine Sorgen über die Feinabstimmung, um die Leistung von MySQL bis zum Äußersten zu optimieren, aber ich weiß, dass das Wichtigste, das einige der besten Ergebnisse liefert, das korrekte Einrichten von Caches / Puffern ist.

Ich habe versucht, die Dinge einfach zu halten, indem ich nur InnoDB als Speicher-Engine verwendet habe. Und ich habe einen dedizierten Server für MySQL. Es hat 8 GB RAM, wie soll ich das zuordnen, um die Leistung zu maximieren? Ich möchte in der Lage sein, meine gesamte Datenbank für die beste Leistung in den Speicher einzupassen. Die Datenbank ist ungefähr 5GB groß. Ist das möglich?

Wie viel Speicher sollte ich dem Abfragecache zuweisen? Was kostet der InnoDB-Pufferpool? Was kostet der Rest des Computers (dh Prozesse, die nicht mit MySQL zusammenhängen)? Etc.

Da ich MyISAM nicht verwende, muss ich nicht wirklich viel Speicher im Schlüssel-Cache ablegen, richtig?

billmalarky
quelle

Antworten:

25

Dies ist schwierig, ohne viel über die Datenbank selbst zu wissen. Es gibt einige Tools, die Sie kennen sollten.

Informationen zum Speichern der gesamten Datenbank im Speicher; Alle Abfragen, die Änderungen an der Datenbank vornehmen, bleiben geöffnet, bis der Schreibvorgang auf der Festplatte ausgeführt wird. Das Einzige, was verhindern kann, dass die Festplatte zu einem Engpass wird, ist ein Festplattencontroller mit einem Schreibcache.

Ich würde mit den folgenden Änderungen beginnen:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Dann würde ich sehen, wie es läuft, und verschiedene Dinge ausprobieren, die (unter anderem) auf der Ausgabe der oben genannten Tools basieren. Ich würde auch sicherstellen, dass Trends mit einem Überwachungstool wie Munin oder Cacti aufgezeichnet werden , um zu sehen, mit welcher Arbeitsbelastung ich tatsächlich zu tun habe. Persönlich habe ich großartige Erfahrungen mit den mit Munin gelieferten MySQL-Plugins.

Kvisle
quelle
Danke, ich werde es versuchen und schauen, ob ich etwas Neues lernen kann.
billmalarky
@billmalarky Willkommen bei serverfault! :) Denken Sie daran, die Frage zu verbessern oder als richtig zu markieren, wenn Sie mit der Antwort zufrieden sind.
Kvisle
+1 für das Empfehlen von mysqltuner.pl !!!
RolandoMySQLDBA
@Kvisle Danke für die Begrüßung! Ich habe eine Weile mit Stackoverflow zu tun (naja ... das sind ein paar Monate ...), aber ich bin neu bei Serverfault. Ich habe tatsächlich mit voxel.net gehostet und das promanaged Hosting (IE-Systemunterstützung) ist wirklich großartig, aber ich dachte, es wäre angemessen, auch eine Außenansicht zu suchen, so dass ich nicht wie ein vollständiges Tool klang, wenn ich mit ihnen darüber sprach.
billmalarky
1
@Kvisle Ich werde auch eine richtige Antwort markieren, aber ich möchte, dass dies ein wenig gedünstet wird, um ein gutes Brainstorming zu erhalten.
billmalarky
9

IMHO sollten Sie in der Lage sein, mit zu gehen

innodb_buffer_pool_size=5G

Dies entspricht 62,5% des Arbeitsspeichers bei ausreichendem Arbeitsspeicher für das Server-Betriebssystem und zusätzlichem Arbeitsspeicher für DB-Verbindungen

@kvisle empfohlen mit mysqltuner.pl. Dieses Skript eignet sich hervorragend, um die Größe des Arbeitsspeichers zu bestimmen, der für join_buffer_size, sort_buffer_size, read_buffer_size und read_rnd_buffer_size reserviert werden soll. Diese 4 zusammenaddierten Puffer werden mit max_connections multipliziert. Diese Antwort wird zu statischen Puffern hinzugefügt (innodb_buffer_pool_size + key_buffer_size). Die kombinierten Summen werden gemeldet. Wenn diese kombinierte Summe 80% des Arbeitsspeichers übersteigt, müssen Sie diese Puffergrößen verringern. mysqltuner.pl wird in dieser Hinsicht sehr hilfreich sein.

Da alle Ihre Daten InnoDB sind, können Sie key_buffer_size (Schlüssel-Cache-Puffer für MyISAM-Indizes) sehr niedrig einstellen (ich empfehle 64 MB).

Hier ist ein Beitrag, den ich in DBA StackExchange erstellt habe, um die empfohlene Größe von innodb_buffer_pool_size zu berechnen .

UPDATE 15.10.2011 19:55 EDT

Wenn Sie wissen, dass Sie über 5 GB Daten verfügen, war meine erste Empfehlung in Ordnung. Ich habe jedoch vergessen, eines hinzuzufügen:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

Die Größe der Protokolldatei muss 25% des InnoDB-Pufferpools betragen

UPDATE 2011-10-16 13:36 EDT

Die 25% -Regel basiert ausschließlich auf der Verwendung von zwei Protokolldateien. Es ist zwar möglich, mehrere innodb-Protokolldateien zu verwenden, zwei funktionieren jedoch normalerweise am besten.

Andere haben mit 25% ausgedrückt

Allerdings hat sich fairerweise jemand von der ursprünglichen InnoBase Oy-Firma gegen die 25% -Regel ausgesprochen, weil er einen größeren InnoDB-Pufferpool hat .

Natürlich kann die 25% -Regel nicht funktionieren, wenn sehr viel RAM vorhanden ist. Tatsächlich beträgt die größte zulässige Größe für innodb_log_file_size bei Verwendung von nur 2 Protokolldateien 2047 MB, da die kombinierte Größe der Protokolldatei weniger als 4 GB (4096 MB) betragen muss.

PUNKTFALL: Einer der Kunden meines Arbeitgebers verfügt über einen DB-Server mit 192 GB RAM. Es gibt keine Möglichkeit, 48G-Protokolldateien zu haben. Ich verwende einfach die maximale Dateigröße für eine Innodb-Protokolldatei, 2047M. @ Kvisles Kommentar zu meiner Antwort enthält lediglich einen Link, der besagt, dass Sie sich nicht auf zwei Protokolldateien beschränken müssen. Wenn Sie N Protokolldateien haben, können diese nicht 4 GB umfassen. Meine 25% -Regel ist nur in einer perfekten Welt (DB Server mit 8 GB oder weniger).

RolandoMySQLDBA
quelle
Danke, ich werde auf jeden Fall mysqltuner.pl benutzen. Ich muss jedoch fragen, ob dieses Skript noch korrekt ist, wenn meine Datenbank gerade leer ist. Ich habe alle Tabellen und Schemata korrekt eingerichtet, aber keine tatsächlichen Daten. Ich habe die 5 GB als Beispielgröße verwendet, die ich auf meinem aktuellen dedizierten Server verwenden würde (das heißt, sobald die Datenbank größer wird, werde ich wahrscheinlich auf einen besseren dedizierten Server wechseln). Momentan ist die Datenbank leer (es ist eine brandneue Site, die noch nicht gestartet wurde), aber ich möchte mysql so einstellen, dass die Skalierung vor dem Start gut funktioniert.
billmalarky
Aktualisiert meine Antwort !!!
RolandoMySQLDBA
Ich möchte einen Kommentar zu "Muss 25% des InnoDB-Pufferpools sein" abgeben. Weil es nicht 100% wahr ist. Lesen Sie dev.mysql.com/doc/refman/5.0/en/… für eine ausführlichere Antwort. In Bezug auf die Leistung hilft es sehr, die Größe gegenüber der Standardeinstellung ein wenig zu erhöhen, aber Sie müssen sie nicht maximieren.
Kvisle,
Rolando, danke für die Hilfe. Ich habe diesen Thread als Referenz markiert. Außerdem verwende ich jetzt dieses mysqltuner-Skript.
Billmalarky