strace mostra muito tempo lendo do socket mysql - o mysql leva muito tempo para executar query?

6

Meu servidor Apache leva muito tempo para processar a solicitação. Eu anexei strace a ele e posso ver os dois atrasos seguintes:

1) Muito crítico (143 segundos para processar)

1335       0.000037 write(16, "5
line from strace
1335       0.000328 socket(PF_LOCAL, SOCK_STREAM, 0) = 16
pidof mysqld
15393
lsof -p 15393
mysqld  15393 mysql   12u  IPv4  26913133       0t0      TCP *:mysql (LISTEN)
1335       0.000040 poll([{fd=14, events=POLLIN}], 1, 5000) = 0 (Timeout)
1335       5.005295 gettimeofday({1403675502, 686212}, NULL) = 0
INSERT INTO 'br_anonymous_user_tokens' ('dtExpires', 'nmToken', 'dtCreated') VALUES ('2014-08-25', '46e35dc39a41e836b806f48d21621b066ea182a9', '2014-06-25')", 161) = 161 1335 0.000111 read(16, "\t
1335       0.000037 write(16, "5
line from strace
1335       0.000328 socket(PF_LOCAL, SOCK_STREAM, 0) = 16
pidof mysqld
15393
lsof -p 15393
mysqld  15393 mysql   12u  IPv4  26913133       0t0      TCP *:mysql (LISTEN)
1335       0.000040 poll([{fd=14, events=POLLIN}], 1, 5000) = 0 (Timeout)
1335       5.005295 gettimeofday({1403675502, 686212}, NULL) = 0
INSERT INTO 'br_anonymous_user_tokens' ('dtExpires', 'nmToken', 'dtCreated') VALUES ('2014-08-25', '46e35dc39a41e836b806f48d21621b066ea182a9', '2014-06-25')", 161) = 161 1335 0.000111 read(16, "\t%pre%%pre%%pre%42\n%pre%%pre%%pre%", 16384) = 13 1335 143.588134 gettimeofday({1403675497, 653337}, NULL) = 0
%pre%%pre%42\n%pre%%pre%%pre%", 16384) = 13 1335 143.588134 gettimeofday({1403675497, 653337}, NULL) = 0

O descritor de arquivos # 16 parece ser o soquete mysql:

%pre%

E aqui

%pre%

Portanto, parece que o Apache está esperando que o mysql execute a consulta que foi gravada no soquete da linha anterior. Estou certo? Isso significa que eu preciso entender por que o MySQL demora tanto para executar consultas simples?

2) Muito longo

%pre%

Aqui, tentei localizar o descritor de arquivo nº 14 para descobrir de onde vem o tempo limite. Eu usei técnicas descritas aqui , mas nenhuma delas mostrou o descritor em questão. Como posso descobrir de onde vem o tempo limite?

    
por Max Koretskyi aka Wizard 25.06.2014 / 08:29

1 resposta

2

O problema está resolvido. Analisei a tabela PROCESSLIST no banco de dados information_schema MySQL e descobri que algumas tabelas estão bloqueadas com o estado Waiting for table level lock . Então eu procurei e descobri que uma razão para o bloqueio pode ser os backups do mysqldump - e isso é exatamente o que eu configurei recentemente. Mas como o trabalho estava mal configurado, ele corria a cada minuto constantemente bloqueando o MySQL. Agora que os backups estão configurados corretamente, o servidor funciona bem.

No entanto, a segunda pergunta com poll continua sem solução.

    
por 25.06.2014 / 11:25