Eu rodei uma aplicação web PHP em um servidor Apache 2.2 (Ubuntu Server 10.04, 8x2GHz, 12Gb RAM) usando prefork
. A cada dia, o Apache recebe cerca de 100 mil a 200 mil solicitações, dessas cerca de 100 a 200 acessos, o limite de tempo limite (cerca de uma em cada mil), praticamente todas as outras solicitações são atendidas bem abaixo do tempo limite.
O que posso fazer para descobrir por que isso acontece? Ou é normal que algumas pequenas partes de todas as solicitações expirem?
Isso foi o que eu fiz até agora:
Comopodeservisto,hápouquíssimassolicitaçõesentreolimitedetempolimiteeasolicitaçãomaisrazoável.Atualmente,olimitedetempolimiteédefinidopara50segundos,anteriormenteeradefinidopara300eaindaeraamesmasituaçãocomalgunstemposlimitee,emseguida,umaenormelacunaatéasoutrassolicitações.
TodasassolicitaçõescomtempolimitesãoAJAX
desolicitações,masagrandemaioriadelasé,talvezsejamaisumacoincidência.OcódigoderetornodoApacheé200
,masolimitedetempolimiteéatingidoclaramente.ElessãodeumaamplagamadeIPsdiferentes.
Euolheiparaospedidosqueexpiramenãohánadaespecialsobreeles,seeufizerosmesmospedidosqueelespassamemmenosdeumsegundo.
Eutenteiolharparaosdiferentesrecursosparaverseconsigoencontraracausa,massemsorte.Hásempremuitamemórialivre(omínimoédecercade3GBlivre),acargaàsvezeschegaa1,4eautilizaçãodaCPUpara40%,masmuitosdostemposlimiteacontecemquandoacargaeautilizaçãodaCPUsãobaixas.Agravação/leituradediscosépraticamenteconstanteduranteodia.NãoháentradasnologdeconsultaslentasdoMySQL(configuradopararegistrarqualquercoisaacimade1segundo),umasolicitaçãonousaessasmuitasgravações/leiturasdebancodedados.
Azul é a utilização da CPU, que tem um pico de 40%, e a carga marrom é de pico com 1,4. Assim, podemos ver que temos tempos limite mesmo com baixa utilização / carga da CPU (os picos de dez segundos correspondem bem à utilização da CPU, mas isso é outro problema, tenho maiores esperanças de descobrir o que pode estar causando isso).
Não há erros no log de erros do Apache e eu não o vi chegar a mais de 200 processos ativos do Apache.
Configurações do servidor:
Timeout 50
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
ServerLimit 350
StartServers 20
MinSpareServers 75
MaxSpareServers 150
MaxClients 320
MaxRequestsPerChild 5000
</IfModule>
Atualização:
Eu atualizei para o Ubuntu 12.04.1, apenas no caso, nenhuma mudança.
Eu adicionei mod_reqtimeout com configurações:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
Agora quase todos os tempos limite acontecem em 10 segundos, um ou dois em 20 segundos. Eu entendo que isso significa que na maioria das vezes está recebendo o corpo da solicitação que é problemático receber? O corpo da solicitação nunca deve ser maior que algumas centenas de bytes.
Eu monitorei o tráfego de rede em uma base de 1 segundo e nunca fica acima de 1Mbit / se eu não vejo nenhum rxerrs ou rxdorps, considerando que o servidor está em uma linha de 1Gbit / s não soa como o HopelessN00b postou sobre. Poderia ser apenas um caso de algumas conexões ruins com o usuário?
Para os picos a cada hora (eles parecem vagar um pouco, nos gráficos acima eles estão em 33 minutos depois da hora, agora eles estão em 12 minutos), eu tentei ver se há alguma coisa correndo periodicamente (crons etc), mas não encontrou nada. A coleta de lixo do PHP é executada duas vezes a cada hora, mas não no momento dos picos, ainda tentei desabilitá-la, mas não faz diferença.
Eu usei dstat com --top-cpu e top para ver os processos no momento dos picos e tudo o que aparece é o apache trabalhando duro por alguns segundos, mas nenhum outro processo está usando cpu significativo. / p>
Eu fiz um gráfico com zoom dos picos:
Para mim, parece que o apache pára por alguns segundos e, em seguida, trabalha duro para processar as solicitações recebidas durante a parada. O que pode causar tal parada, ou eu estou interpretando mal?