Verwenden mehrerer Kerne für einzelne MySQL-Abfragen unter Debian

10

Ich verwende einen MySQL-Server für Tests auf einer VM (VMWare) mit Debian als Gastbetriebssystem. Der Gast hat vier emulierte CPU-Kerne, daher habe ich thread_concurrency auf vier gesetzt.

Ich mache teure Joins an großen Tabellen, was einige Minuten dauern kann, aber ich sehe auf dem Gastbetriebssystem, dass jeweils nur ein Kern verwendet wird. Dies geschieht unabhängig von der für die beteiligten Tabellen verwendeten Speicher-Engine (getestet mit MyISAM und InnoDB). Außerdem scheint die gesamte Datenbank blockiert zu sein, wenn diese großen Abfragen ausgeführt werden. Ich kann keine zusätzlichen Abfragen parallel ausführen. Seltsamerweise zeigt htop, dass sich der für die Abfrage verwendete Kern während der Laufzeit der Abfrage ändert!

Warum passiert das?

Dies ist der relevante Eintrag von SHOW FULL PROCESSLIST;(es gibt keine anderen Abfragen):

| 153 | root       | localhost | pulse_stocks  | Query   |   50 | Copying to tmp table | 
SELECT DISTINCT * FROM 
`pulse_stocks`.`stocks` sto,
`pulse_new`.`security` sec
WHERE
(sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
sto.id
LIMIT 0, 30 

Es sind keine weiteren Abfragen ausstehend. Eine weitere interessante Beobachtung ist, dass MySQL diese Frage in einer Sekunde beantwortet, wenn ich den ORDER BYTeil weglasse.

Das was SHOW ENGINE INNODB STATUS;zeigt:

=====================================
120316  9:55:56 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 49 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 47258, signal count 47258
Mutex spin waits 0, rounds 10260, OS waits 39
RW-shared spins 94442, OS waits 47210; RW-excl spins 1, OS waits 1
------------
TRANSACTIONS
------------
Trx id counter 0 5381
Purge done for trx's n:o < 0 1810 undo n:o < 0 0
History list length 2
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 7503, OS thread id 140316748777216
MySQL thread id 154, query id 654 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0 5380, ACTIVE 105 sec, process no 7503, OS thread id 140316748977920
 fetching rows, thread declared inside InnoDB 429
mysql tables in use 2, locked 0
MySQL thread id 153, query id 623 localhost root Copying to tmp table
SELECT DISTINCT * FROM 
    `pulse_stocks`.`stocks` sto,
    `pulse_new`.`security` sec
WHERE
    (sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
    ( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
    sto.id
LIMIT 0, 30

Trx read view will not see trx with id >= 0 5381, sees < 0 5381
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
116089 OS file reads, 7 OS file writes, 7 OS fsyncs
1063.16 reads/s, 117085 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 5, seg size 7,
0 inserts, 0 merged recs, 0 merges
Hash table size 17393, node heap has 1 buffer(s)
0.00 hash searches/s, 14.73 non-hash searches/s
---
LOG
---
Log sequence number 0 38201270
Log flushed up to   0 38201270
Last checkpoint at  0 38201270
0 pending log writes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 20638760; in additional pool allocated 994816
Dictionary memory allocated 162680
Buffer pool size   512
Free buffers       0
Database pages     511
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 816631, created 0, written 1
7597.72 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 964 / 1000
--------------
ROW OPERATIONS
--------------
1 queries inside InnoDB, 0 queries in queue
2 read views open inside InnoDB
Main thread process no. 7503, id 140316711446272, state: waiting for server activity
Number of rows inserted 0, updated 0, deleted 0, read 160338394
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 1495933.31 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
Thomas
quelle
Bitte veröffentlichen Sie die Ausgabe von SHOW FULL PROCESSLIST (möglicherweise bereinigt) und SHOW ENGINE INNODB STATUS, um zu diagnostizieren, warum "die gesamte Datenbank" gesperrt ist.
Aaron Brown
Vielen Dank, ich habe die Frage mit den angeforderten Informationen aktualisiert.
Thomas
1
Wenn keine anderen Abfragen ausgeführt werden, gibt es keinen Hinweis darauf, dass die gesamte Datenbank gesperrt ist. Können Sie diesen Zustand reproduzieren und posten, was passiert, wenn die lang laufende Abfrage offenbar andere ausschließt?
Baron Schwartz
Ok, ich habe das überprüft. Es ist möglich, andere Abfragen in der MySQL-Konsole durchzuführen, selbst wenn die große Abfrage ausgeführt wird. Phpmyadmin reagiert jedoch überhaupt nicht auf einfache Anmeldeversuche, während die Abfrage ausgeführt wird. Die Ausführungszeit selbst beträgt häufig weniger als 10 Sekunden, die Abfrage bleibt jedoch einige Minuten lang im Status "Daten senden".
Thomas

Antworten:

10

Sie werden dies vielleicht überraschen, aber Sie sollten innodb_thread_concurrency auf 0 setzen (was unendliche Parallelität ist). Auf diese Weise kann die InnoDB Storage Engine entscheiden, wie viele Parallelitätstickets ausgestellt werden sollen.

Ich habe am 26. Mai 2011 einen Beitrag über InnoDBs Multicore-Engagement (MySQL 5.5, auch MySQL 5.1.38 InnoDB Plugin) geschrieben .

Gemäß der MySQL-Dokumentation funktioniert die Variable thread_concurrency nur für Solaris .

Ich habe noch ein Problem: Sind Ihre JOINs MyISAM und InnoDB zusammen involviert? Das Sperrverhalten von MyISAM für vollständige Tabellen macht das Sperren und MVCC auf Zeilenebene von InnoDB ungültig .

Wenn Sie MySQL 5.5 nicht verwenden, aktualisieren Sie bitte so schnell wie möglich, um die Multicore-Engagement-Optionen von InnoDB einzurichten .

UPDATE 19.03.2012 08:30 EDT

Ab MySQL 5.1.38 können Sie das InnoDB-Plugin installieren, um neue Einstellungen für das Multicore-Engagement zu verwenden. Sie müssen die Einstellungen jedoch richtig einstellen.

In der Tat unkonfiguriert gelassen

RolandoMySQLDBA
quelle
Vielen Dank. Bedeutet Ihre Antwort, dass die Verwendung mehrerer Kerne in Version 5.1.X nicht implementiert ist?
Thomas
Ja und nein. Ich sage JA, da InnoDB 5.1.x keine Multicore-Einstellungen hat. Ich sage NEIN, da Sie das InnoDB-Plugin für diese neuen Einstellungen installieren können, es ist jedoch nur für MySQL 5.1.38 und höher verfügbar.
RolandoMySQLDBA
@ RolandoMySQLDBA: Entschuldigung, ich weiß, dass dieser Beitrag alt ist, aber ich habe festgestellt, dass MySQL auf meinem Server (der 24 Kerne hat) nur 1 Kern verwendet. Ich habe das überprüft, innodb_thread_cuncurrencywie Sie bereits erwähnt haben, und es ist auf 0 gesetzt. Deshalb habe ich mich gefragt, warum MySQL keine weiteren Kerne verwendet.
Monamona
1
@monamona Das ist nicht die einzige Einstellung, mit der man spielen kann. Sie müssen auch innodb_read_io_threads und innodb_write_io_threads höher einstellen (Versuchen Sie 8, 16, 32 und 64).
RolandoMySQLDBA
@monamona Bitte lesen Sie meinen alten Beitrag dba.stackexchange.com/questions/2918/… für weitere Details
RolandoMySQLDBA
2

MySQL, jede Version, hat keinen Code, um mehrere Kerne in einer einzigen Verbindung zu verwenden.

Percona kann in seinem Xtradb besser mehrere Kerne über mehrere Verbindungen hinweg verwenden. InnoDB geht bei etwa 8 Kernen der Dampf aus; Xtradb flacht bei 32 oder so ab.

Eine "große Abfrage" könnte das Sperren der Tabelle (oder der Zeilen der Tabelle) sein, die eine andere Verbindung benötigt. Schauen wir uns die Abfrage und die SHOW CREATE TABLE an.

Rick James
quelle