Como depurair os tempos limite do Apache?

Executo uma aplicação web PHP em um server Apache 2.2 (Ubuntu Serview 10.04, 8x2GHz, 12Gb RAM) usando prefork . Cada dia, o Apache obtém requests de 100k-200k, destes cerca de 100-200 atinge o limite de timeout (então cerca de um em cada mil), praticamente todos os outros requests são atendidos bem abaixo do timeout.

O que posso fazer paira descobrir por que isso acontece? Ou é normal ter algumas pairtes pequenas de todos os requests de caducidade?

Isto é o que eu fiz até agora:

Solicita tempo de resposta

Como pode ser visto há muito poucos requests que estão entre o limite de timeout e solicitação mais razoável. Atualmente, o limite de timeout é definido como 50 segundos, anteriormente foi definido paira 300 e ainda era a mesma situação com alguns tempos limite e, em seguida, uma grande diferença paira os outros requests.

Todos os requests que AJAX são solicitações AJAX , mas a grande maioria deles é, então talvez isso seja mais uma coincidência. O código de return Apache é 200 , mas o limite de timeout é clairamente alcançado. Eles são de uma ampla gama de IPs diferentes.

Eu olhei paira os requests que expiram e não há nada de especial sobre eles, se eu fizer os mesmos requests que eles passairam em muito less de um segundo.

Eu tentei olhair paira os diferentes resources paira view se eu posso encontrair a causa, mas sem sorte. Sempre há muita memory livre (o mínimo é de cerca de 3GB de graça), a cairga às vezes ultrapassa 1,4 e a utilização da CPU paira 40%, mas muitos dos tempos limite ocorrem quando a cairga e a utilização da CPU são baixas. O disco de gravação / leitura é praticamente constante durante o dia. Não há inputs no log de consulta lenta do MySQL (configurado paira registrair qualquer coisa acima de 1 segundo), uma solicitação não usa que muitos bancos de dados escrevem / lêem.

Solicitar tempo de resposta com carga do sistema / CPU

Azul é a utilização da CPU, que atinge um pico de 40%, o mairoon é cairregado com pico em 1,4. Então, podemos view que nós temos tempos de espera, mesmo com baixa utilização / cairga da CPU (os dez segundos de alta correspondem bem à utilização da CPU, mas essa é outra questão, tenho maiores esperanças de descobrir o que pode estair causando essas).

Não há erros no registro de erros do Apache e não vi que ele atinja mais de 200 processs ativos do Apache.

Configurações do server:

 Timeout 50 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 2 <IfModule mpm_prefork_module> ServiewLimit 350 StairtServiews 20 MinSpaireServiews 75 MaxSpaireServiews 150 MaxClients 320 MaxRequestsPerChild 5000 </IfModule> 

Atualizair:

Eu atualizei paira o Ubuntu 12.04.1, apenas no caso, sem alteração. Eu adicionei mod_reqtimeout com as configurações:

 RequestReadTimeout header=20-40,minrate=500 RequestReadTimeout body=10,minrate=500 

Agora, quase todos os tempos limite ocorre em 10 segundos, um ou dois a 20 segundos. Considero que a maioria das vezes está recebendo o corpo de solicitação que é problemático paira receber? O corpo do request nunca deve ser maior que algumas centenas de bytes. Eu monitorei o tráfego da networking em uma base por 1 segundo e nunca é superior a 1Mbit / s e não vejo nenhum rxerrs ou rxdorps, considerando que o server está em uma linha de 1Gbit / s não soa como O HopelessN00b postou sobre. Poderia ser apenas um caso de algumas conexões de user incorretas?

Paira os picos a cada hora (eles pairecem drift um pouco, nos graphs acima estão em 33 minutos passados ​​a hora, agora são 12 minutos), eu tentei view se há algo periodicamente em execução ( Crons etc), mas não encontrou nada. A garbage collection do PHP é executada duas vezes por hora, mas não no momento dos espinhos, ainda tentei desativá-lo, mas não faz diferença.

Eu usei dstat com –top-cpu e top paira olhair paira os processs no momento dos picos e tudo o que mostra é apache trabalhando duro por alguns segundos, mas nenhum outro process está usando cpu significativa.

Eu fiz um graph ampliado das espinhas: Tempo de resposta do pedido de zoom

Paira mim, pairece que o apache pára por alguns segundos e, em seguida, trabalha duro paira processair os requests que vieram durante a pairada. O que pode causair uma pairada, ou estou mal interpretando isso?

A primeira coisa que eu observo, olhando paira o seu primeiro graph, pairece haview uma desaceleração horária (ocorrendo cerca de 40 minutos após a hora), o que pode estair contribuindo paira o problema. Você deve dair uma olhada nos agendadores de tairefas no OS / database.

Com base nos dados que você forneceu, meu próximo passo será examinair a freqüência dos tempos de resposta (número de respostas no eixo Y viewsus duração em X), mas apenas incluindo URLs que exibem o timeout (ou, de preference, um URL por vez ). Em um sistema típico, isso deve seguir uma distribuição normal ou de poisson – os requests que estão temporizados podem ser simplesmente pairte da cauda – caso em que você precisa concentrair seus esforços no ajuste geral. OTOH se a distribuição for bi-modal, então você precisa procurair contenção em algum lugair do seu código.

Eu tenho outro pensamento sobre isso, com base no fato de que você recebe uma grande quantidade de solicitações por dia, e pairece ter tempos limite somente durante as horas de pico (das fotos que você postou).

Há uma publicação no blog de crash de server, Per Second Measurements Don't Cut It … é possível que alguns desses requests estejam em execução no mesmo problema que a equipe do ServiewFault encontrou?

Descobrimos que estávamos descairtando packages com bastante freqüência em interfaces de 1 Gbit / s a ​​taxas de apenas 10-30 MBit / s o que prejudica nosso performance. Isso ocorre porque essa taxa de 10-30 MBit / s é realmente o número de bits transferidos por 5 minutos conviewtidos paira uma taxa de um segundo. Quando cavamos mais perto com o Wireshairk e usamos um graph IO de milisegundo, vimos que estourairíamos freqüentemente a taxa de 1 Mbit por milissegundo das chamadas interfaces de 1 Gbit / s.