Determine o script php causando o carregamento enorme do MySQL

2

Estou administrando uma organização jovem sem fins lucrativos com o objetivo de oferecer hospedagem gratuita na web.

Desde alguns dias, nossa carga de servidor é em torno de 1.5, às vezes aumentando para 7. top me mostra que o MySQL é o bad boy:

PID  USER   PRI  NI  VIRT   RES   SHR  S CPU%  MEM%  TIME+   Command
26362 mysql 20   0   2757M  762M  5872 S 16.0  7.7   3h54:51 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/shadow.err --open-files-limit=50000 --pid-file=/var/lib/mysql/shadow.pid

Você tem uma ideia de como posso determinar o script que está executando a consulta? Obrigado pela sua ajuda.

    
por Max13 01.05.2013 / 18:58

3 respostas

2

Como usuário root do mysql, tente:

 mysql> show processlist;

Isso permitirá que você identifique a consulta que está causando o carregamento e permita rastreá-la de volta ao script php que está procurando.

Nota: Se o uso da CPU do processo mysql for baixo (como mostrado na saída superior), mas você está experimentando uma carga > 1, é provável que o mysql esteja causando muito IO.

    
por 01.05.2013 / 19:04
2

MOSTRAR PROCESSLIST COMPLETA;

Isto lhe dará consultas atualmente em execução em seu servidor e o tempo gasto por ele, copiar e anexar uma consulta com EXPLAIN EXTENDED e avaliar o resultado para fazer alterações apropriadas na consulta, adicionando índices, alterando tipos de dados, etc.

Você não deve usar valores de variáveis padrão, deve sempre alterar algumas das variáveis para obter um ótimo desempenho como query_cache_size, key_buffer, table_cache, sort_buffer, read_rnd_buffer_size, thread_cache etc.

Referência: link

    
por 03.05.2013 / 08:40
2

Se você habilitar o log de consultas lentas no mysql, ele lhe dará um ponto de partida para qualquer instrução SQL que consuma muitos recursos. Ele não lhe dirá qual script PHP foi o culpado, mas você terá o banco de dados, a tabela, o SQL e a hora do problema;
link

The slow query log consists of SQL statements that took more than long_query_time seconds to execute and required at least min_examined_row_limit rows to be examined.

Execute a seguinte consulta;

set global slow_query_log = 1;

Por padrão, o log de consultas lentas pode ser acessado assim;

mysqldumpslow /var/log/mysql/mysql-slow.log

aqui estão alguns exemplos de análise das informações no log de consultas lentas aqui: link

Você pode combinar isso com o exame dos arquivos de log do servidor da web, para localizar solicitações que ocorreram ao mesmo tempo que a consulta de longa execução. Por exemplo, depois de encontrar uma consulta particularmente lenta, examine os arquivos de log do apache ou nginx;

[root@vps001 www]# vi /var/log/httpd/access_log

mostrará a você qual arquivo php corresponde a uma solicitação de tempo específica;

185.142.237.8 - - [03/Jul/2016:04:27:14 +0000] "POST /xmlrpc.php HTTP/1.1" 200 370 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"
    
por 10.07.2016 / 00:29