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?

Temnovit
fonte

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.

shakalandy
fonte
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).

Kyle Brantley
fonte
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.

Niall Donegan
fonte
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%.

Alister Bulman
fonte
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.

regilero
fonte
Obrigado, de fato, mysql não é o único processo em torno :)
Temnovit