Prueba de carga con AB ... solicitudes fallidas falsas (longitud)

209

Para hacer algunas pruebas de carga, para mi propia curiosidad, en mi servidor ejecuté:

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

Esto abre 50 conexiones de mantenimiento durante 200 segundos y simplemente cierra mi servidor con solicitudes de index.php

En mis resultados, obtengo:

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

Tenga en cuenta las solicitudes "fallidas" 32951. No puedo resolver esto.

Mientras se ejecutaba la prueba, pude acceder a mi sitio web desde la computadora de mi casa perfectamente, aunque los tiempos de carga de la página en la parte inferior de la página se informaron como .5 en lugar del .02 habitual. Sin embargo, nunca tuve una solicitud fallida.

Entonces, ¿por qué AB informa que la mitad de las conexiones fallan? ¿Y qué significa "Longitud:" en ese contexto?

Benjamín
fuente
¿Su sitio web tiene un equilibrador de carga? Vea mi publicación de blog sobre pruebas de carga con equilibradores de carga que podrían explicar la situación "funciona para mí" en las pruebas de carga.
Patrick Lightbody

Respuestas:

361

No importa. El "fallo de longitud" simplemente indica que aproximadamente la mitad del tiempo la duración de la respuesta fue diferente.

Dado que el contenido es dinámico, probablemente sea el identificador de sesión o algo así.

Jeff Atwood
fuente
8
Hola, me encontré con el mismo "problema" y me alegro de que esta respuesta estuviera aquí. Gracias!
Richard Hurt
2
Gracias por la respuesta, tenía exactamente la misma duda.
Saiyine
63
Sí, dos años después, esta respuesta sigue siendo realmente útil.
Sergi
11
No se apresure a atribuir esto a los desajustes de longitud de contenido variable. ab no informa el código de estado HTTP 500 como errores en su resumen. La razón de la falta de coincidencia de longitud podría ser que tiene un error real. Puede usar -v 4 para obtener más información (mejor canalización a un archivo ya que habrá muchas impresiones).
Tal Lev-Ami
3
En realidad, se explica en el manual ab aquí httpd.apache.org/docs/current/programs/ab.html "Si la longitud del documento cambia durante las pruebas, la respuesta se considera un error".
Захар Joe
132

Para describir el problema en otras palabras:

La herramienta de evaluación comparativa de apache (ab) supone que la longitud del contenido de la respuesta será la misma durante toda la prueba. Almacena la longitud del contenido de la primera respuesta. Si alguna de las respuestas tiene una longitud de contenido diferente, resultan en "fallas de longitud".

El siguiente informe de error de apache parece confirmar que: Error de ASF 42040

Resumen : si está sirviendo algún contenido de longitud variable, probablemente debería ignorar este tipo de fallas de solicitud ab.

Editar : recientemente me di cuenta de que el abcomando tiene una nueva opción (al menos para mí):

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

Puedo verlo en ab Versión 2.3 <$ Revisión: 1528965 $> pero no puedo verlo en ab Versión 2.3 <$ Revisión: 655654 $> , por lo que probablemente se agregó relativamente recientemente.

Dariusz Walczak
fuente
44
Para cualquier persona en una Mac, es probable que su versión de ab esté detrás y -l no lo tome. Puede instalar desde la fuente o mediante homebrew, pero "brew install ab" no funciona porque es parte del paquete apache; puede instalar con "brew install homebrew / apache / ab".
netpoetica
8

Lamento resucitar una vieja pregunta, pero fue la primera que apareció en Google. A veces, el error de longitud informado por ab puede haber sido causado por un problema real: si la conexión se cierra del lado del servidor antes de que el cliente no haya recibido la cantidad total de bytes declarados en el encabezado Content-Length. Eso puede suceder si hay otras partes entre el cliente y el servidor, por ejemplo, equilibradores de carga artesanales ingenuos (mi caso).

zentrunix
fuente