2012-03-13 5 views
5

Estoy tratando de descubrir por qué mysqld a veces satura la CPU y los puestos.diagnosticar y evitar puntas de CPU MySQL

Sospecho que tiene algo que ver con actualizar los índices u otro tipo de mantenimiento. Me gustaría probar esta hipótesis y analizar las opciones para evitarla.

Aquí está la situación. Tengo docenas de tablas, pero de acuerdo con la actividad, parece que hay al menos dos que constantemente sufren de esto. Vamos a llamarlos Big y Small. Big contiene aproximadamente 6,000 filas que suman 1Mb (así que no es tan grande) y Small tiene docenas de filas, alrededor de 50 bytes cada una. Big tiene una clave externa a Small (InnoDB, en cascada de eliminación, no nulo).

Existen dos situaciones que parecen desencadenar el problema: a) una modificación de un valor Big.small_id, o b) la adición de una fila a Small.

Me intuitivamente esperaría a) a ser muy muy rápido, O(log(size of Big)) y b) para ser virtualmente instantánea porque Small es tan pequeño y ninguna de las referencias Big 's a que han cambiado.

En cada caso, el SELECT siguiente toma algo así como veinte gigaciclos (!); el uno después de eso no toma tiempo en absoluto. Hay otras tablas que tienen claves foráneas para ambas tablas, pero todas son bastante pequeñas y supongo que no son responsables de este aumento.

¿Cómo puedo saber qué índices está actualizando MySQL y cuánto tiempo tarda cada uno?

O, si no está actualizando los índices, ¿cómo puedo saber qué más está tardando tanto?

Finalmente, ¿puedo configurar mysqld para dar una prioridad de subproceso más bajo a este trabajo, y/o deshabilitar temporalmente el índice para permitir que las selecciones no indexadas (no bloqueantes) sucedan simultáneamente con la tarea de mantenimiento?

Respuesta

1

Probablemente haya una solución mejor, pero anteriormente tenía una situación en la que necesitaba encontrar lo que db/table usaba muchas CPU ocasionalmente. Hice un cronjobbed en una "lista de procesos de muestra" y tuve la salida adjuntada a un registro continuo. Estaba haciendo esto cada segundo y mantuve una ventana de 6 horas.

+0

SHOW PROCESSLIST muestra que una consulta se encuentra en estado "Enviando datos" durante mucho tiempo. No es más descriptivo que eso. Dudo que sea una etiqueta justa porque estoy en localhost, transmisison no debería ser un cuello de botella. ¿A donde voy desde aqui? Gracias – spraff

2

Otra herramienta de diagnóstico que puede ver es mytop. Básicamente es un contenedor para SHOW PROCESSLIST, pero proporciona un acceso más rápido a estos datos cuando ve un problema y no tiene una aplicación/clúster mysql disponible para ejecutar comandos.

También, echar un vistazo a: MySQL "Sending data" horribly slow

Cuestiones relacionadas