Pregunta strace muestra lectura de mucho tiempo desde mysql socket: ¿mysql tarda mucho tiempo en ejecutar la consulta?


Mi servidor Apache tarda mucho tiempo en procesar la solicitud. Le adjunto strace y puedo ver los dos retrasos siguientes:

1) Muy crítico (143 segundos para procesar)

1335       0.000037 write(16, "\235\0\0\0\3INSERT INTO `br_anonymous_user_tokens` (`dtExpires`, `nmToken`, `dtCreated`) VALUES ('2014-08-25', '46e35dc39a41e836b806f48d21621b066ea182a9', '2014-06-25')", 161) = 161
1335       0.000111 read(16, "\t\0\0\1\0\1\374\262\n\2\0\0\0", 16384) = 13
1335     143.588134 gettimeofday({1403675497, 653337}, NULL) = 0

El descriptor de archivo # 16 parece ser un socket mysql:

line from strace
1335       0.000328 socket(PF_LOCAL, SOCK_STREAM, 0) = 16

Y aquí

pidof mysqld
15393
lsof -p 15393
mysqld  15393 mysql   12u  IPv4  26913133       0t0      TCP *:mysql (LISTEN)

Así que parece que Apache está esperando que mysql ejecute la consulta que se escribió en el socket en la línea anterior. Estoy en lo cierto ¿Significa que luego necesito entender por qué MySQL tarda tanto en ejecutar una consulta simple?

2) muy largo

1335       0.000040 poll([{fd=14, events=POLLIN}], 1, 5000) = 0 (Timeout)
1335       5.005295 gettimeofday({1403675502, 686212}, NULL) = 0

Aquí traté de localizar el descriptor de archivo # 14 para averiguar de dónde proviene el tiempo de espera. Utilicé técnicas descritas aquí, pero ninguno de ellos mostró el descriptor en cuestión. ¿Cómo puedo saber de dónde viene el tiempo de espera?


6
2018-06-25 06:29


origen


Sí, debe consultar las estadísticas de MySQL para ver por qué lleva tanto tiempo realizar esa consulta. - Tero Kilkanen


Respuestas:


El problema está resuelto. Miré a través del PROCESSLIST mesa en information_schema Base de datos MySQL y se encontró que algunas tablas están bloqueadas con el estado Waiting for table level lock. Entonces busqué y encontré que una razón para el bloqueo pueden ser las copias de seguridad de mysqldump, y esto es exactamente lo que configuré recientemente. Pero debido a que el trabajo estaba mal configurado, se ejecutó cada minuto bloqueando constantemente MySQL. Ahora que las copias de seguridad están configuradas correctamente, el servidor funciona bien.

Sin embargo, la segunda pregunta con poll queda sin resolver.


2
2018-06-25 09:25



Utilizando --single-transaction con mysqldump evitará los bloqueos de tablas durante la copia de seguridad, si está utilizando InnoDB. - Michael - sqlbot
Gran consejo, gracias! ¿Cuáles son las implicaciones de usar --single-transaction? ¿Y cómo debo usarlo si hago copias de seguridad como esta: mysqldump -h example.com -u username -ppassword dbname | gzip > db.zip ? - Max Wizard K