Alto uso de CPU do MySQL [fechado]

191

Recentemente, a CPU do meu servidor está subindo muito.

A carga da CPU calcula a média de 13,91 (1 min) 11,72 (5 minutos) 8,01 (15 minutos) e meu site teve apenas um pequeno aumento no tráfego.

Depois de executar um comando superior, vi o MySQL usando 160% da CPU!

Recentemente, otimizei as tabelas e mudei para conexões persistentes. Isso pode estar fazendo com que o MySQL use grandes quantidades de CPU?

Juddling
fonte
4
Conexões persistentes são quase sempre não é a coisa certa para usar.
jason
vou tirá-los agora e observar a diferença, porque nunca me lembro da CPU estar acima de 2 há um mês!
Julgando 15/08/09
2
Servidores tendem a ter mais de um núcleo. A porcentagem de uso da CPU é calculada em relação a um núcleo, ou seja, um processo que use dois núcleos completamente terá um uso de CPU de 200%. Aqui, o MySQL está usando 100% de um núcleo e 60% de outro núcleo. Isso não significa que todas as CPUs estão esgotadas, provavelmente ele ainda tem pelo menos duas CPUs livres.
xaav 18/08/11
Alta CPU quase sempre significa consultas ineficientes. Geralmente, esses são resolvidos por meio de uma melhor indexação (especialmente 'composta') e / ou reformulação da consulta.
Rick James

Respostas:

265

Primeiro, eu diria que você provavelmente deseja desativar as conexões persistentes, pois elas quase sempre causam mais danos do que benefícios.

Em segundo lugar, eu diria que você deseja verificar seus usuários do MySQL, apenas para garantir que não seja possível que alguém esteja se conectando a partir de um servidor remoto. Isso também é importante para verificar a segurança.

Em terceiro lugar, eu diria que você deseja ativar o Slow Query Log do MySQL para ficar de olho em todas as consultas que estão demorando muito tempo e usar isso para garantir que você não tenha nenhuma consulta bloqueando as tabelas de chaves por muito tempo.

Algumas outras coisas que você pode verificar seriam executar a seguinte consulta enquanto a carga da CPU estiver alta:

SHOW PROCESSLIST;

Isso mostrará todas as consultas que estão em execução no momento ou na fila para execução, qual é a consulta e o que está fazendo (esse comando truncará a consulta se for muito longa, você pode usar SHOW FULL PROCESSLIST para ver o texto completo da consulta) .

Você também vai querer manter um olho em coisas como o tamanho do buffer, cache de tabela , cache de consultas e innodb_buffer_pool_size (se você estiver usando InnoDB tabelas) como todas estas atribuições de memória pode ter um efeito sobre o desempenho da consulta que pode causar MySQL para consome CPU.

Você provavelmente também desejará ler as seguintes, pois elas contêm algumas informações boas.

Também é uma boa ideia usar um criador de perfil. Algo que você pode ativar quando quiser, que mostrará quais consultas seu aplicativo está executando, se houver consultas duplicadas, quanto tempo estão demorando etc. etc. Um exemplo de algo assim é sobre o qual estou trabalhando chamado PHP Profiler, mas existem muitos por aí. Se você estiver usando um software como Drupal, Joomla ou Wordpress, poderá perguntar pela comunidade, pois provavelmente existem módulos disponíveis para eles, que permitem que você obtenha essas informações sem precisar integrar nada manualmente.

Steven Surowiec
fonte
12
muito obrigado por isso, removi as conexões persistentes e configurei o log de consultas lentas. Eu li o log e a maioria das consultas veio de duas tabelas e as tabelas não foram indexadas corretamente! faz apenas cerca de 10 minutos, mas eis o resultado: a carga da CPU calcula a média de 0,48 (1 min) 0,95 (5 minutos) 2,42 (15 minutos) muito obrigado
Juddling
mesmo problema, resolvido por indexar as tabelas que retardar o processo, obrigado Steven e Juddling
gabrielem
@Juddling Você poderia elaborar como indexar uma tabela, por favor? Talvez algum link? Sei que já faz um tempo, mas sou realmente novo nessa coisa. Desculpe fr a questão noobish
JayVDiyk
Registrar as consultas lentas me ajudou a encontrar meu problema específico de alta utilização da CPU. No meu caso, era um plugin do Wordpress (ultimate-tag-cloud-widget) que fazia uma consulta monstruosa a cada clique apenas para mostrar as tags populares. É um ótimo plugin, mas precisa ser aprimorado com algum tipo de cache (acabei personalizando-o para resolver meu problema).
Jkincali
Outra coisa que ajudou a um problema diferente foi modificar o parâmetro innodb_buffer_pool_size mencionado acima. Enquanto tentava encontrar a causa da alta utilização da CPU, li em algum lugar que innodb_buffer_pool_size deve ter pelo menos o tamanho do arquivo ibdata1, localizado em / var / lib / mysql. Parece que o InnoDB funciona com muito mais eficiência quando é capaz de residir na memória. Isso pode ser difícil em algumas situações, porque o ibdata1 pode ser enorme! Também foi sugerido em algum lugar para garantir que innodb_log_buffer_size seja 25% do tamanho de innodb_buffer_pool_size.
Jkincali
167

Como este é o post principal, se você pesquisar no MySQL por alto uso ou uso de CPU, adicionarei uma resposta adicional:

Em 1 de julho de 2012, um segundo de salto foi adicionado à hora UTC atual para compensar a lenta rotação da Terra devido às marés. Ao executar o ntp (ou ntpd), este segundo foi adicionado ao relógio do seu computador / servidor. O MySQLd não parece gostar desse segundo extra em alguns sistemas operacionais e gera uma alta carga de CPU. A solução rápida é (como root):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start
RedPixel
fonte
22
Como o post original foi há cerca de três anos, duvido que seja a causa do problema do pôster original. Mas foi a causa do meu problema e me salvou agora - então, obrigado! Mais informações: blog.mozilla.org/it/2012/06/30/…
Russell G
5
Mesmo problema e solução para mim no Ubuntu 12.04. Etapas para resolver um pouco diferente: serviço ntp parada data &&-s " date" && serviço NTP iniciar o uso da CPU MySQL instantaneamente caiu de 50 - 100% para 0 - 1%
David Laing
2
Isso pode ser executado apenas para garantir? Quero dizer, é seguro executá-lo mesmo que não seja o motivo?
Muhammad Gelbana 01/09/2013
2
1 de julho de 2015 - Acabei de experimentar esse segundo erro de salto em um servidor atual do AWS EC2 executando o Amazon Linux. Use sudo service ntpd stopnesta configuração.
Matt van Andel
1
+1 para esta solução. Meu MySQL estava rodando de 50 a 60% por meses sem motivo; depois de aplicar essa solução, ele caiu para 0,0% a 0,3%, o que era como deveria ser. Muito obrigado.
Zeeshan 5/08
32

Se este servidor estiver visível para o mundo exterior, vale a pena verificar se há muitos pedidos para conectar-se a partir do mundo externo (ou seja, pessoas tentando invadir)

Rowland Shaw
fonte
1
Não sei por que isso atraiu uma votação anônima, já que isso foi uma causa no passado para alguns sistemas.
Rowland Shaw
2
Eu acho que o voto negativo é porque ter o MySQL visível para o mundo exterior não é uma boa ideia.
21813 MikeKulls
9
@MikeKulls Não, não é uma boa ideia, pois agirá como um alvo para muitas pessoas tentarem obter entrada, o que proporcionará uma carga de CPU alta - daí a minha resposta como um possível motivo.
precisa
16
Eu odeio quando alguém apenas baixa votos e vai!
Muhammad Gelbana 01/09/2013
1
+1 porque esta é uma razão absolutamente legítima para o MySQL ter alto uso de CPU, e qualquer pessoa para quem essa é a resposta realmente precisa dessa informação!
Chris Browne