O Apache ficou fora de controle nos últimos dias e fez o MySQL travar duas vezes. Tudo começou quando eu migrei um site WordPress sobre o qual também contém um fórum phpBB.
Não tenho muita experiência em administração de servidores, por isso tem sido muito difícil identificar o que está causando o problema. Quando notei que o MySQL estava inoperante, corri o TOP e vi meu carregamento do sistema subir para 98,00. O servidor executa 10 V-HOSTS, os quais recebem uma quantidade saudável de tráfego, então eu obviamente estava vendo muitos processos apache-2 em execução.
A alta carga do servidor continuou por 10 minutos e depois voltou ao estado normal. Não vi um pico de tráfego de rede neste momento.
Infelizmente, o registro de erros do MySQL foi desativado (agora é reativado), portanto não há pistas. Mas eu tenho certeza que é porque o Apache estava consumindo todos os recursos, então o ID do processo do MySQL foi eliminado.
Minhas perguntas são:
Da próxima vez que isso ocorrer - como posso identificar o que está causando o pico de carga do sistema? Poderia ser um script php que enlouqueceu? Poderia ser um ataque DDOS?
Existe uma maneira de reiniciar automaticamente o MySQL quando ele trava?
Eu já instalei htop
. Isso poderia ser mais útil do que top
?
Aqui estão as estatísticas do meu servidor:
m1.xlarge (8 ECUs, 4 vCPUs, 15 GiB memory, 4 x 420 GiB Storage Capacity)
Ubuntu Server 12.04.3 LTS
fonte
dmesg
ajudaria?Respostas:
O MySQL ainda pode não registrar nada, porque o que provavelmente está acontecendo é que ele está sendo morto sem cerimônia pelo sistema devido à pressão da memória do sistema pelos filhos do apache. Deve haver uma trilha disso em / var / log / syslog.
O MySQL deve tentar se reiniciar em um travamento ou terminação forçada, mas a menos que haja memória suficiente disponível, ele não pode fazer isso ... e esta segunda falha não é vista pelo mysqld_safe como um "travamento", mas como uma "recusa a iniciar ", para que não continue tentando. A tentativa de reinicialização com falha geralmente é mal interpretada pelos administradores como "falha", pois a natureza da falha original está oculta por trás de uma mensagem facilmente ignorada no log de erros do MySQL:
Consulte Crash Post Mortem do InnoDB para obter uma circunstância que suspeito ser semelhante à sua.
A resposta aparentemente simples para "por que" é que, entre o Apache e o MySQL, a carga que você tem e as configurações atuais, você não tem memória suficiente na máquina e há um ponto de inflexão relacionado à carga de tráfego que traz essa condição à tona .
O Apache atende a cada solicitação simultânea do navegador a partir de um processo filho; portanto, do número de conexões simultâneas aumentar, o número de filhos aumentará. Você primeiro precisará limitar esse valor na configuração do apache para entender o que realmente está causando o aumento de conexões simultâneas ... é simplesmente um pico de tráfego pesado, mas legítimo? Algum tipo de negação de serviço? Consultas de banco de dados que atrasam solicitações porque demoram muito? Algo que precisa ser otimizado?
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients
Limitar os processos concorrentes do Apache deve ajudar a evitar isso, mas, para ficar claro, é ingênuo pensar que essa é a solução completa, então não quero sugerir isso. Depois que os processos estiverem limitados a um nível razoável ou pelo menos mais seguro, você poderá continuar identificando o que realmente está acontecendo. (Existem outros controles de restrição no Apache, mas essa não é minha área de especialização.)
Naturalmente, a "melhor prática" é executar seu banco de dados em hardware diferente, para que o aplicativo não possa matá-lo. Embora pareça mais eficiente, na superfície, "maximizar a utilização" de uma máquina compartilhando-a, essa é uma economia falsa. A maioria da memória usada pelo MySQL, em uma carga de trabalho típica, é alocada no momento da inicialização e mantida enquanto o MySQL Server estiver em execução. É provável que as demandas da CPU compartilhem horários de pico para MySQL e Apache, uma vez que estão servindo a mesma carga. Você pode realmente estar melhor com duas máquinas m1.large em vez da única m1.xlarge, e o custo seria o mesmo, pois a menor é exatamente a metade do preço da maior ... mesmo se você já pagou antecipadamente para o desconto adicional, essa alteração pode ser realizada .
fonte
Você tem alguns pontos para verificar:
-Verifique as / var / log / messages: oomkiller pode matar o processo mysql se não houver mais memória para usar. Verifique o ram com free -lm (sem cache)
-Se você usa o apache com prefork mpm: verifique o número de processos. Se o apache empilhar um número importante de processos (durante uma carga de trabalho pesada) com um link para o mysql, a latência e a memória usadas podem crescer rapidamente.
-Verifique o número de threads iniciados pelo mysql com um status global show : threads_cached, threads_created e threads_running são importantes para verificar (threads_created deve estar próximo de 0).
-Verifique o carneiro usado pelo Mysql.
fonte
Você também pode procurar na implementação de cpusets e reservar recursos para o mysql. É o mais próximo da execução desses serviços em hardware diferente, mas ainda oferece os benefícios de manter um único servidor.
fonte