Uso de múltiples núcleos para consultas MySQL individuales en Debian


10

Estoy ejecutando un servidor MySQL para pruebas en una VM (VMWare) con Debian como SO huésped. El invitado tiene cuatro núcleos de CPU emulados, por lo que configuré thread_concurrency en cuatro.

Estoy haciendo costosas uniones en tablas grandes, lo que puede llevar varios minutos, pero veo en el sistema operativo invitado que solo se usa un núcleo a la vez. Esto sucede independientemente del motor de almacenamiento utilizado para las tablas involucradas (probado con MyISAM e InnoDB). Además, toda la base de datos parece estar bloqueada al hacer estas consultas grandes, no puedo hacer consultas adicionales en paralelo. Curiosamente, htop muestra que el núcleo utilizado para la consulta cambia durante el tiempo de ejecución de la consulta.

¿Por qué pasó esto?

Esta es la entrada relevante de SHOW FULL PROCESSLIST;(no hay otras consultas):

| 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 

No hay otras consultas pendientes. Otra observación interesante es que MySQL responderá esta consulta en un segundo, si omito la ORDER BYparte.

Esto lo que SHOW ENGINE INNODB STATUS;muestra:

=====================================
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
============================

Publique el resultado de SHOW FULL PROCESSLIST (posiblemente desinfectado) y SHOW ENGINE INNODB STATUS para ayudarnos a diagnosticar por qué "toda la base de datos" está bloqueada.
Aaron Brown

Gracias, actualicé la pregunta con la información solicitada.
Thomas

1
Si no hay otras consultas en ejecución, entonces no hay evidencia de que toda la base de datos esté bloqueada. ¿Puede reproducir esta condición y publicar lo que sucede cuando la consulta de larga duración aparentemente bloquea a otros?
Baron Schwartz

Ok, revisé esto. Es posible hacer otras consultas en la consola mysql, incluso cuando la consulta grande se está ejecutando. Sin embargo, phpmyadmin no responde en absoluto, incluso a simples intentos de inicio de sesión, mientras se ejecuta la consulta. El tiempo de ejecución en sí mismo suele ser inferior a 10 segundos, pero la consulta permanece en el estado de "envío de datos" durante varios minutos.
Thomas

Respuestas:


10

Puede encontrar esto sorprendente, pero debe establecer innodb_thread_concurrency en 0 (que es concurrencia infinita). Esto permitirá que el motor de almacenamiento de InnoDB decida cuántos tickets de concurrencia se emitirán.

Escribí una publicación sobre el compromiso multinúcleo de InnoDB (MySQL 5.5, también MySQL 5.1.38 InnoDB Plugin) el 26 de mayo de 2011 .

Según la documentación de MySQL, la variable thread_concurrency solo funciona para Solaris .

Tengo una inquietud más: ¿son sus UNIONES involucrando a MyISAM e InnoDB juntos? El comportamiento de bloqueo de la tabla completa de MyISAM anula el bloqueo de nivel de fila de InnoDB y MVCC .

Si no está utilizando MySQL 5.5, actualice lo antes posible para configurar las opciones de participación multinúcleo de InnoDB .

ACTUALIZACIÓN 2012-03-19 08:30 EDT

A partir de MySQL 5.1.38, puede instalar el complemento InnoDB para usar nuevas configuraciones para la interacción multinúcleo. Sin embargo, debe ajustar la configuración correctamente.

De hecho, se dejó sin configurar


Muchas gracias. ¿Su respuesta implica que el uso de múltiples núcleos no está implementado en la versión 5.1.X?
Thomas

Si y no. Digo SÍ porque InnoDB 5.1.x no tiene configuraciones multinúcleo. Digo NO porque puede instalar el complemento InnoDB para esta nueva configuración, pero solo está disponible para MySQL 5.1.38 y superior.
RolandoMySQLDBA

@RolandoMySQLDBA: Lo siento, sé que esta publicación es antigua, pero descubrí que mysql en mi servidor (que tiene 24 núcleos) solo usa 1 núcleo. Lo comprobé innodb_thread_cuncurrencymientras me menciona y está configurado en 0, así que me preguntaba por qué mysql no usa más núcleos.
monamona

1
@monamona Ese no es el único escenario para jugar. También debe establecer innodb_read_io_threads e innodb_write_io_threads más alto (Pruebe 8, 16, 32 y 64).
RolandoMySQLDBA

@monamona Por favor lea mi publicación anterior dba.stackexchange.com/questions/2918/… para más detalles
RolandoMySQLDBA

2

MySQL, cualquier versión, no tiene ningún código para usar múltiples núcleos en una sola conexión.

Percona hace un mejor trabajo al usar múltiples núcleos a través de múltiples conexiones en su Xtradb. InnoDB se queda sin vapor a unos 8 núcleos; Xtradb se aplana a los 32 aproximadamente.

Una "consulta grande" podría estar bloqueando la tabla (o filas de la tabla) que necesita alguna otra conexión. Miremos la consulta y la MOSTRAR CREAR TABLA.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.