Eu acho que seu problema é na verdade muitos clientes Apache para a memória do seu servidor. Quando você recebe um grande surto de tráfego, os processos do Apache se acumulam eventualmente usando toda a RAM. Isso força o sistema operacional a começar a forçar a entrada e a saída de processos, o que tende a piorar as coisas. Eventualmente, sua memória swap se esgota e o SO mata qualquer coisa que ache melhor ... neste caso, o MySQL, já que ele usa muita memória. Note que aumentar a memória swap apenas atrasará a queda inevitável.
Eu começaria reduzindo o MAXCLIENTS
do Apache para um valor mais razoável com base na capacidade do seu servidor. Você pode fazer uma estimativa aproximada executando top
e observando as colunas RES/SHR
dos processos httpd
. A diferença entre eles é aproximadamente o quanto cada processo filho usa. Por exemplo, em meus servidores, o uso médio de memória por filho é de 40 MB e eu quero que o Apache use apenas 3 GB, então meu MAXCLIENTS
está definido para 75 (3000/40). Você pode jogar com este valor e algumas das outras configurações de conexão do Apache um pouco, conforme necessário, para evitar que o Apache use toda a RAM e comece a bater na troca.
Você também pode ver isso do ponto de vista do que está causando o grande número de clientes Apache. Se for um surto / pico real de tráfego, é provável que você precise de um servidor maior ou de mais servidores ou adicione uma camada de cache para diminuir a carga no Apache. Se o seu servidor for muito lento para lidar com o número normal de solicitações de entrada, você vai querer diminuir o MAXCLIENTS
do Apache para um nível que ele consiga manipular sem fazer o backup das solicitações. Ou talvez haja um problema no servidor, no aplicativo ou no banco de dados que esteja causando o bloqueio ou o congelamento de itens que precisam ser localizados e corrigidos.