Processo MySQL ultrapassa 100% do uso da CPU


10

Estou com alguns problemas com meu servidor LAMP. Recentemente, tudo ficou muito lento, embora a contagem de visitantes nos meus sites não tenha mudado muito. Quando executo o topcomando, ele diz que o processo MySQL ocupou mais de 150 a 200% da CPU. Como isso é possível, eu sempre pensei que 100% é o máximo?

Estou executando o Ubuntu 9.04 Server Edition com 1,5 GB de RAM.

my.cnf configurações:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Aqui está a saída do MySQLTuner :

Saída do MySQLTuner

O topcomando:

saída superior

Qual poderia ser a causa deste problema? Posso fazer alterações no meu my.cnfpara impedir a suspensão do servidor?

Respostas:


15
  1. Aumente o buffer de chaves (o seu atualmente é de 64 MB, mas o total de índices é de 116 milhões, portanto, coloque pelo menos 128 MB). Deve ajudar imediatamente.
  2. Execute mysqloptimize e mysqlrepair em suas tabelas
  3. Aumente o cache da tabela / diminua o número total de tabelas para aumentar a taxa de acertos do cache da tabela. Talvez você tenha algumas tabelas antigas ou não usadas que podem ser excluídas.

Outras opções de confusão recomendadas:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • consultas de log que não usam índices

Verifique o arquivo de log após algum tempo.


Obrigado pelas recomendações, vou experimentá-las e informar se ajudou.
Temnovit

diga-me por favor, como você calculou que o total de índices é de 116 milhões?
Temnovit

eu consegui :)
Temnovit

5

Você possui um processador que possui mais de um núcleo ou vários processadores. Se você tiver dois núcleos e um processo estiver usando 100% dos dois núcleos, será exibido como 200% no topo.

Da mesma forma, isso provavelmente está funcionando como planejado - nada está errado com sua configuração. Se você estiver enfrentando travamentos frequentes, do que publicou, convém adicionar índices adequados às suas tabelas (ou otimizar suas consultas).


5

Execute top -Hpara ver todos os threads em execução e não apenas o processo geral. Além disso, se você pressionar a 1tecla enquanto estiver no topo, ela mostrará o uso da CPU para as CPUs / núcleos individuais.


Obrigado, isso realmente me ajudou - uso o top há anos e não sabia que tinha essa capacidade. Eu descobri que há um thread mysql "eterno" que consome 60% da CPU do usuário o tempo todo, enquanto os threads de consulta vêm e vão além disso. Agora, para descobrir o que esta discussão está realmente fazendo ...
scipilot

1

O Mysql possui vários processos (threads) trabalhando de forma independente; um, por exemplo, é responsável por gravar dados da memória no disco. Com vários núcleos na CPU (e / ou várias CPUs), mais de um thread está funcionando e, portanto, ele pode executar mais de 100% de um único núcleo - em um nível simplista, talvez 75% de cada um dos dois núcleos esteja em execução. , dando 150%.


1

Percebi um problema, não relacionado à CPU. Se você estiver usando apache e MySQL no mesmo servidor, poderá alcançar más condições ( RAM ) quando a atividade do apache aumentar.

O MySQLTunner informa que, usando as 200 conexões disponíveis (sua configuração de conexão máxima), você preencherá a RAM. Digamos que você tenha o apache limitado a 150 processos, você certamente não terá RAM suficiente quando o MySQL e o apache tentarem usar 150 conexões (já que o Apache também é um bom consumidor de RAM).

Portanto, trata-se de RAM e talvez você ainda não tenha sido atingido :-) Os comandos superiores mostram apenas 15 processos apache (mas você está em uma média de carga de 3/6/16, o que significa que a tempestade ocorreu há 15 minutos e agora está em saindo).

Sobre o problema da CPU, para complementar a boa resposta de shakalandy , isso pode ocorrer por causa de uma única consulta. Ele pode estar em uma mesa enorme ou executar várias tarefas de reindexação ou usar muitos arquivos temporários, um índice ausente (removido?) Etc. A única maneira de detectá-lo é ativar o log lento de consultas (talvez com um thresold alto, como 8s). Em seguida, use a ferramenta mysqlsla para analisar esse log de consultas lento e execute algumas explicações nas consultas identificadas.


Obrigado, de fato, mysql não é o único processo em torno :)
Temnovit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.