Carregar teste com AB ... solicitações falhadas falhadas (comprimento)

209

Para fazer alguns testes de carga, por minha própria curiosidade, no meu servidor, executei:

ab -kc 50 -t 200 http://localhost/index.php

Isso abre 50 conexões keep-alive por 200 segundos e apenas bate meu servidor com pedidos de index.php

Nos meus resultados, recebo:

Concurrency Level:      50
Time taken for tests:   200.007 seconds
Complete requests:      33106
Failed requests:        32951
   (Connect: 0, Receive: 0, Length: 32951, Exceptions: 0)
Write errors:           0
Keep-Alive requests:    0
Total transferred:      1948268960 bytes
HTML transferred:       1938001392 bytes
Requests per second:    165.52 [#/sec] (mean)
Time per request:       302.071 [ms] (mean)
Time per request:       6.041 [ms] (mean, across all concurrent requests)
Transfer rate:          9512.69 [Kbytes/sec] received

Observe as solicitações "com falha" do 32951. Eu não consigo descobrir isso.

Enquanto o teste estava sendo executado, consegui acessar perfeitamente meu site no meu computador em casa, embora o tempo de carregamento da página na parte inferior da página tenha sido relatado como 0,5 em vez do 0,02 habitual. No entanto, nunca tive uma solicitação falhada.

Então, por que a AB está relatando que metade das conexões falha? E o que significa "Length:" nesse contexto?

Benjamin
fonte
Seu site tem um balanceador de carga? Veja minha postagem no blog sobre teste de carga com balanceadores de carga que podem explicar a situação "funciona para mim" no teste de carga.
2426 Patrick Lightbody

Respostas:

360

Deixa pra lá. A "falha de comprimento" indica apenas que cerca da metade do tempo da duração da resposta foi diferente.

Como o conteúdo é dinâmico, é provavelmente o identificador da sessão ou algo assim.

Jeff Atwood
fonte
8
Ei, acabei de encontrar o mesmo "problema" e estou feliz por esta resposta estar aqui. Thanx!
Richard Hurt
2
Obrigado pela resposta, tive exatamente a mesma dúvida.
Saiyine
63
Sim, dois anos depois, essa resposta ainda é realmente útil.
Sergi
11
Não seja muito rápido para atribuir isso a diferenças de comprimento de conteúdo variável. ab não relata o código de status HTTP 500 como erros em seu resumo. O motivo da incompatibilidade de comprimento pode ser que você tenha um erro real. Você pode usar -v 4 para obter mais informações (canal melhor para um arquivo, pois haverá muita impressão).
Tal Lev-Ami
3
Na verdade, é explicado no manual ab httpd.apache.org/docs/current/programs/ab.html "Se o comprimento do documento for alterado durante o teste, a resposta será considerada um erro."
Joe Joe
132

Para descrever o problema em outras palavras:

A ferramenta de benchmark do apache (ab) assume que a duração do conteúdo da resposta será a mesma durante todo o teste. Ele armazena o tamanho do conteúdo da primeira resposta. Se alguma das respostas adicionais tiver comprimento de conteúdo diferente, elas resultarão em "falhas de comprimento".

O seguinte relatório de bug do apache parece confirmar que: ASF Bug 42040

Resumo : se você estiver exibindo algum conteúdo de tamanho variável, provavelmente deverá ignorar esse tipo de falha na solicitação de ab.

Edit : Eu notei recentemente que o abcomando tem uma nova opção (pelo menos para mim):

-l   Accept variable document length (use this for dynamic pages)

Eu posso vê-lo na versão 2.3 <$ Revisão: 1528965 $>, mas não na versão 2.3 <$ Revisão: 655654 $> , por isso provavelmente foi adicionado recentemente.

Dariusz Walczak
fonte
4
Para qualquer pessoa em um Mac, é provável que sua versão de ab esteja atrasada e -l não demore. Você pode instalar a partir da fonte ou via homebrew, mas "brew install ab" não funciona porque faz parte do pacote apache - você pode instalar com "brew install homebrew / apache / ab".
Netpoetica
8

Desculpe ressuscitar uma pergunta antiga, mas foi a primeira que apareceu no Google. Às vezes, o erro de comprimento relatado por ab pode ter sido causado por um problema real: se a conexão estiver fechada no servidor antes que a quantidade total de bytes declarados no cabeçalho Content-Length não tenha sido recebida pelo cliente. Isso pode acontecer se houver outras partes entre o cliente e o servidor, por exemplo, balanceadores de carga artesanais ingênuos (meu caso).

zentrunix
fonte