ApacheBench: Solicite tempos indo para o éter

1

Eu tenho um servidor Apache que é proxy para o Tomcat via mod_jk. Eu configurei um log personalizado no Apache para registrar os tempos de acesso:

LogFormat "%h %l %u %t \"%r\" %>s %b %D" transfertimes
CustomLog /path/to/transfer-times.log transfertimes

Estou executando o ApacheBench no próprio servidor da web. Percebi que à medida que eu aumentei a simultaneidade, meus tempos de solicitação de percentil 99 parecem aumentar exponencialmente, embora o percentil 50 permaneça relativamente estável. Como exemplo, o ApacheBench dirá que cerca de 10 solicitações de 1000 levam > 1 segundo para responder com um nível de simultaneidade de 100.

No entanto, quando olho para o transfer-times.log, nenhuma solicitação aparece como maior que 1 segundo, com base no% D no LogFormat . Eu estou tentando descobrir o que causaria a disparidade entre o log do Apache e os tempos de acesso relatados do ApacheBench. Normalmente eu poderia atribuí-lo à latência de rede, mas estou executando tudo isso em um único host. Eu estou pensando que deve haver algo peculiar com parâmetros TCP do Linux ou descritores de arquivo que eu preciso ajustar, mas não tenho certeza por onde começar.

    
por natacado 06.06.2009 / 02:32

2 respostas

1

É possível que na verdade não seja o apache que leva tanto tempo para a solicitação ser veiculada, mas que você encontre algum outro limite já definido no sistema operacional.

Dê uma olhada no que o netstat lhe dá sobre o número de conexões aceitas, é muito possível que você encontre grandes diferenças no número de pedidos que o apache vê (e, portanto, está atendendo dentro do prazo que o apache conhece) e número de solicitações que o sistema operacional já pode atender.

netstat -tulpen

pode ser de ajuda aqui. Também dê uma olhada no que o sysctl diz sobre os limites, ou talvez até o iptables.

Me desculpe, não consigo me lembrar de nenhum detalhe desde que já faz um bom tempo desde que me deparei com esses problemas.

    
por 08.06.2009 / 08:42
0

Eu acho que o seu pedido está sentado no backlog aceito devido a trabalhadores insuficientes no apache ou no handoff mod_jk.

Para fazer o proxy corretamente entre o apache e o tomcat, você precisa definir o conector do tomcat para lidar com tantas conexões quantas o apache forçar os filhos. Se você não tiver o apache, terá que bloquear a espera para o tomcat liberar uma conexão. Isso pode levar a um bloqueio adicional, pois os funcionários que estiverem aguardando o tomcat não estarão disponíveis para lidar com conexões de entrada.

link

ps. Não tome %D como evangelho. Ele mede apenas o tempo entre o filho iniciando do apache (portanto, não conta a duração da aceitação / transferência / entrega) e a hora em que o último byte é enviado via send() (portanto, é altamente variável devido ao buffer do sistema operacional). p>

pps. ajuste AJP é uma arte negra, IMHO os benefícios da AJP (um pouco mais fácil de analisar solicitação, conexões persistentes) já não são motivo suficiente para evitar proxy HTTP direto.

    
por 10.06.2009 / 16:19