Maximale CPU- und Speicherauslastung für MySQL kann nicht genutzt werden


7

Schönen Tag.

Ich weiß, dass dies ein Duplikat anderer Fragen sein kann, aber ich habe alle Vorschläge in vielen Threads angewendet, aber ich bleibe bei demselben Problem.

Ich habe eine einzelne gespeicherte Prozedur, die mit max 3 tables. Wenn ich die Prozedur ausführe, wird nur 30% of my CPUverwendet und ungefähr 25% of RAM.

Ich sitze mit einem CPU with 4 cores and 16GB RAM.

my.ini sieht wie folgt aus:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache_size = 16
query_cache_size= 32M
thread_concurrency = 0

log-bin=mysql-bin

binlog_format=mixed

server-id   = 1

innodb_buffer_pool_size = 12G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_read_io_threads = 64
innodb_write_io_threads = 64

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Ist es die Art der aufgerufenen Prozedur, die dazu führt, dass MySQL die Hardware nicht ausnutzt, oder ist es meine Konfiguration?

Ich lief XAMPP, merkte dann aber, dass es 32-Bit war, also wechselte ich zur 64-Bit-Version von WAMP. Ich verwende ein 32-Bit MySQLWorkbench, um Abfragen auszuführen.

Ich benutze die InnoDB engine.

Verwenden von MySQL Ver 14.14 Distrib 5.5.24 Win64 (x86).


Wie sieht dein IO aus?
Derek Downey

Es springt von 2 auf 11%, aber nicht mehr als 11%
Stephen H

Welche Version von MySQL? (Ausführen SELECT VERSION();)
RolandoMySQLDBA

Ver 14.14 Distrib 5.5.24 Win64 (x86)
Stephen H

Wir wissen nicht, was das Verfahren bewirkt, daher können wir nicht sagen, ob die Art des Verfahrens ein Problem darstellt. Wie lange dauert die Ausführung der Prozedur? Wenn es schnell ist, erhalten Sie möglicherweise keine genauen Messwerte für die CPU-Auslastung.
G-Nugget

Antworten:


5

Die Autoren von High Performance MySQL beschreiben einen Teil Ihres Problems ziemlich kurz (S. 234):

MySQL kann auf vielen CPUs keine einzelne Abfrage parallel ausführen. Dies ist eine Funktion, die von einigen anderen Datenbankservern angeboten wird, jedoch nicht von MySQL.

Wenn Sie eine einzelne gespeicherte Prozedur ausführen, wird nicht mehr als einer Ihrer CPU-Kerne zum Ausführen von Abfragen verwendet. Bei anderen Kernen, die von verschiedenen Hintergrund- und Arbeitsthreads verwendet werden, z. B. solchen, die E / A ausführen, wird ein wenig mehr verwendet. MySQL wird nur dann wirklich die volle Leistung eines Multi-Core- oder Multi-Prozessor-Systems nutzen, wenn mehrere Abfragen gleichzeitig ausgeführt werden.

Wenn 30% von 1 Kern verwendet werden, weist dies auf ein potenzielles Problem hin, aber 1,2 von 4 Kernen für eine einzelne Abfrage sind ganz normal.


3

Trotz all der Änderungen, die Sie vorgenommen haben my.ini, möchte ich nur noch eine vorschlagen:

Ich habe festgestellt, dass Sie innodb_buffer_pool_instances nicht festgelegt haben .

Laut der MySQL-Dokumentation ist dies für innodb_buffer_pool_instances gedacht :

Die Anzahl der Regionen, in die der InnoDB-Pufferpool unterteilt ist. Bei Systemen mit Pufferpools im Multi-Gigabyte-Bereich kann die Aufteilung des Pufferpools in separate Instanzen die Parallelität verbessern, indem Konflikte beim Lesen und Schreiben verschiedener Threads auf zwischengespeicherten Seiten verringert werden. Jede Seite, die im Pufferpool gespeichert oder aus diesem gelesen wird, wird mithilfe einer Hashing-Funktion zufällig einer der Pufferpoolinstanzen zugewiesen. Jeder Pufferpool verwaltet seine eigenen freien Listen, Flush-Listen, LRUs und alle anderen Datenstrukturen, die mit einem Pufferpool verbunden sind, und ist durch seinen eigenen Pufferpool-Mutex geschützt.

Diese Option wird nur wirksam, wenn Sie innodb_buffer_pool_size auf eine Größe von 1 Gigabyte oder mehr festlegen. Die von Ihnen angegebene Gesamtgröße wird auf alle Pufferpools aufgeteilt. Geben Sie für eine optimale Effizienz eine Kombination aus innodb_buffer_pool_instances und innodb_buffer_pool_size an, sodass jede Pufferpoolinstanz mindestens 1 Gigabyte beträgt.

Der Standardwert ist 1. Da Sie 4 Kerne haben, würde ich ihn auf 4 setzen. Bitte fügen Sie diese Variable hinzu zu my.ini:

[mysqld]
innodb_buffer_pool_instances = 4

Da dies keine dynamische Variable ist, müssen Sie mysql wie folgt neu starten

C:\> net stop mysql
C:\> net start mysql

Versuche es !!!

UPDATE 2013-05-24 12:16 EDT

Wenn my.iniich noch einmal auf Ihre schaue , habe ich einige weitere Empfehlungen in Bezug auf die Speichernutzung:


Hallo, ich habe es versucht, aber es ist immer noch begrenzt. Auf dem Protokoll steht:The InnoDB memory heap is disabled InnoDB: Not using CPU crc32 instructions InnoDB: Initializing buffer pool, size = 12.0G
Stephen H
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.