J'exécute un serveur MySQL pour des tests sur a VM (VMware) avec Debian en tant que système d'exploitation invité. L'invité a quatre cœurs de processeur émulé, donc j'ai défini thread_concurrency sur quatre.
Je fais des jointures coûteuses sur de grandes tables, qui peuvent prendre plusieurs minutes, mais je vois sur le système d'exploitation invité, qu'un seul noyau est utilisé à la fois. Cela se produit quel que soit le moteur de stockage utilisé pour les tables impliquées (testé avec Myisam et InnoDB). De plus, toute la base de données semble être bloquée lors de ces grandes requêtes, je ne peux pas faire de requêtes supplémentaires en parallèle. Strangement HTOP montre que le noyau utilisé pour les changements de requête au cours de l'exécution de la requête!
Pourquoi cela arrive-t-il?
C'est l'entrée pertinente de SHOW FULL PROCESSLIST;
(Il n'y a pas d'autres requêtes):
| 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
Il n'y a pas d'autres requêtes en attente. Une autre observations intéressantes est que MySQL répondra à cette requête dans une seconde, si je laisse sortir le ORDER BY
partie.
Ce quoi SHOW ENGINE INNODB STATUS;
spectacles:
=====================================
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
============================
Vous pouvez trouver cela surprenant, mais vous devez définir l'innodb_thread_concurrency à 0 (qui est une concurrence infinie). Cela permettra au moteur de stockage InnoDB de décider du nombre de billets de concurrence à émettre.
Selon la documentation MySQL, le thread_concurrency variable fonctionne uniquement pour Solaris.
J'ai encore une préoccupation: vos jointures impliquant Myisam et InnoDb sont-elles ensemble? Comportement de verrouillage complet de MyISAM's Table de Myisam Nulifie le verrouillage de niveau de ligne d'InnoDB et le MVCC .
Si vous n'utilisez pas MySQL 5.5, Merci de mettre à niveau ASAP afin de configurer les options d'engagement multicœurs d'Innodb .
En commençant par MySQL 5.1.38, vous pouvez installer le plugin InnoDB pour utiliser de nouveaux paramètres pour l'engagement de multicore. Cependant, vous devez accorder correctement les paramètres.
En fait, gauche non configuré
MySQL, n'importe quelle version, n'a pas de code pour utiliser plusieurs noyaux dans une connexion A Single.
Percona fait un meilleur travail d'utilisation de plusieurs cœurs à travers multiple connexions dans son Xtradb. InnoDB manque de vapeur à environ 8 noyaux; Xtradb aplatit à 32 ans environ.
Une "grande requête" pourrait verrouiller la table (ou des rangées de la table) que certains autres besoins de connexion ont besoin. Regardons la requête et le spectacle crée une table.