Ich habe einige dedizierte MySQL-Server kennengelernt, die nie mehr als einen Kern verwenden. Ich bin mehr Entwickler als DBA für MySQL, brauche also etwas Hilfe
Konfiguration
Die Server sind mit einer Last vom Typ OLAP / DataWarehouse (DW) recht voll:
- Primär: 96 GB RAM, 8 Kerne + einzelnes RAID 10-Array
- Test: 32 GB RAM mit 4 Kernen
- Die größte Datenbank hat 540 GB, die Gesamtgröße liegt bei 1,1 TB, hauptsächlich InnoDB-Tabellen
- Solaris 10 Intel-64
- MySQL 5.5.x
Hinweis: Die größte Datenbank ist die vom OLTP-DR-Server replizierte, von der der DW geladen wird. Es ist keine vollständige DW: Sie dauert nur 6 Monate bis 6 Wochen, ist also kleiner als die OLTP-DB.
Beobachtungen auf einem Testserver
- 3 getrennte Anschlüsse
- jeder hat eine gleichzeitige (und unterschiedliche)
ALTER TABLE...DROP KEY...ADD INDEX
- Die 3 Tabellen haben 2,5, 3,8 und 4,5 Millionen Zeilen
- Die CPU-Auslastung steigt auf 25% (ein Kern ist maximal) und nicht höher
- die 3 ÄNDERUNGEN dauern 12-25 Minuten (eine einzelne dauert 4,5)
Fragen
- Welche Einstellung oder welcher Patch ist erforderlich, um die Verwendung mehrerer Kerne zu ermöglichen?
Das heißt, warum verwendet MySQL nicht alle verfügbaren Kerne? (wie andere RDBMS) - Ist es eine Folge der Replikation?
Weitere Hinweise
- Ich verstehe den Unterschied zwischen einem RDBMS-Thread und einem Betriebssystem-Thread
- Ich frage nicht nach irgendeiner Form von Parallelität
- Einige der Systemvariablen für InnoDB und Threads sind nicht optimal
(auf der Suche nach einem schnellen Gewinn) - Kurzfristig kann ich das Festplattenlayout nicht ändern
- Das Betriebssystem kann bei Bedarf angepasst werden
- Ein einziger ALTER TABLE auf dem kleinsten Tisch dauert 4,5 Minuten (schockierende IMO)
Bearbeiten 1
- innodb_thread_concurrency ist auf beiden auf 8 gesetzt. Ja, es ist falsch, aber MySQL verwendet nicht mehrere Kerne
- innodb_buffer_pool_size beträgt 80 GB bei primären und 10 GB bei einem Test (eine andere Instanz wird heruntergefahren). Dies ist vorerst in Ordnung.
- innodb_file_per_table = ON
Bearbeiten 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method sollte O_DIRECT sein (SHOW VARIABLES zeigt dies jedoch nicht an)
- innodb_doublewrite = OFF
- Dateisystem = ZFS (und mein Sysadmin hat dies gefunden: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Zu testen
- innodb_flush_method wird nicht als O_DIRECT angezeigt, wenn es sein sollte
- Folgen Sie den Einstellungen von RolandoMySQLDBA
Lassen Sie mich wissen, wenn ich etwas Wichtiges verpasst habe
Prost
Aktualisieren
Geänderte innodb_flush_method + 3 x Thread-Einstellungen in RolandoMySQLDBAs Antwort
Ergebnis:> 1 für die Tests verwendeter Core = positives Ergebnis
\G
. Ich denke auch, dass SHOW INNODB STATUS
es zugunsten von SHOW ENGINE INNODB STATUS
5.5 veraltet ist (ich bekomme einen Fehler beim Ausführen des ersteren in der Kommandozeile.