O processo do MySQL ultrapassa 100% do uso da CPU

7

Estou com alguns problemas com o meu servidor LAMP. Recentemente, tudo ficou muito lento, mesmo que a contagem de visitantes em meus sites não tenha mudado muito. Quando eu executo o comando top , ele diz que o processo do MySQL assumiu 150-200% da CPU. Como isso é possível, sempre achei que 100% é o máximo?

Estou executando a edição do servidor Ubuntu 9.04 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 :

Ocomandotop:

Qual poderia ser a causa desse problema? Posso fazer alterações no meu my.cnf para impedir que o servidor seja interrompido?

    
por Temnovit 08.01.2011 / 20:47

5 respostas

14
  1. Aumentar buffer de chave (atualmente, o seu é de 64 MB, mas os índices totais são de 116 milhões, portanto, coloque pelo menos 128 MB). Deve ajudar imediatamente.
  2. Executa mysqloptimize e mysqlrepair em suas tabelas
  3. Aumenta o cache da tabela / diminui 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 utilizadas que possam 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 não usando índices

Verifique o arquivo de registro depois de algum tempo.

    
por 08.01.2011 / 22:24
5

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

Da mesma forma, isso provavelmente está funcionando conforme o esperado - nada está errado com sua configuração. Se você está enfrentando interrupções freqüentes, do que você postou, você pode querer olhar para adicionar índices apropriados para suas tabelas (ou otimizar suas consultas).

    
por 08.01.2011 / 21:00
3

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

    
por 08.01.2011 / 21:29
1

O Mysql tem múltiplos processos (threads) trabalhando independentemente, um deles, 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, 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%.

    
por 08.01.2011 / 21:03
1

Eu notei um problema, não relacionado à CPU. Se você estiver usando o apache e o MySQL no mesmo servidor, poderá atingir condições ruins ( RAM ) quando a atividade do apache aumentar.

O MySQLTunner diz que usando as 200 conexões disponíveis (sua configuração máxima de conexão) você irá preencher a RAM. Digamos que você tenha limitado o apache a um processo que 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 comedor de RAM).

Então, isso é sobre RAM e talvez você ainda não tenha sido atingido :-) Os principais comandos mostram apenas 15 processos apache (mas você está com carga média de 3/6/16, o que significa que a tempestade ocorreu há 15 minutos e está agora em sair).

Sobre o problema da CPU, para complementar a boa resposta de shakalandy , isso pode ser devido a uma única consulta. Ele pode estar em uma tabela grande, ou fazer muitas tarefas de re-indexação, ou usar muito arquivo temporário, um índice faltando (removido?), Etc. A única maneira de detectá-lo é ativar a consulta lenta log (talvez com um thresold alto, como 8s). Em seguida, use a ferramenta mysqlsla para analisar esse log de consultas lentas e execute algumas explicações sobre as consultas identificadas.

    
por 09.01.2011 / 14:39