Lasttest mit AB… gefälschte fehlgeschlagene Anfragen (Länge)

209

Um aus eigener Neugier einige Lasttests auf meinem Server durchzuführen, habe ich Folgendes ausgeführt:

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

Dies öffnet 50 Keep-Alive-Verbindungen für 200 Sekunden und knallt meinen Server nur mit Anfragen nach index.php

In meinen Ergebnissen bekomme ich:

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

Beachten Sie die 32951 "fehlgeschlagenen" Anforderungen. Ich kann das nicht herausfinden.

Während der Test ausgeführt wurde, konnte ich von meinem Heimcomputer aus perfekt auf meine Website zugreifen, obwohl die Ladezeiten der Seiten am Ende der Seite als 0,5 anstelle der üblichen 0,02 angegeben wurden. Ich hatte jedoch nie eine fehlgeschlagene Anfrage.

Warum meldet AB, dass die Hälfte der Verbindungen fehlschlägt? Und was bedeutet "Länge:" in diesem Zusammenhang?

Benjamin
quelle
Verfügt Ihre Website über einen Load Balancer? Lesen Sie meinen Blog-Beitrag zum Testen von Lasten mit Load Balancern , in dem möglicherweise die Situation "Es funktioniert für mich" beim Testen von Lasten erklärt wird.
Patrick Lightbody

Antworten:

360

Keine Ursache. Der "Längenfehler" zeigt lediglich an, dass etwa die Hälfte der Zeit die Länge der Antwort unterschiedlich war.

Da der Inhalt dynamisch ist, ist es wahrscheinlich die Sitzungskennung oder ähnliches.

Jeff Atwood
quelle
8
Hey, ich bin gerade auf das gleiche "Problem" gestoßen und bin froh, dass diese Antwort hier war. Danke!
Richard Hurt
2
Danke für die Antwort, ich hatte genau den gleichen Zweifel.
Saiyine
63
Ja, zwei Jahre später ist diese Antwort immer noch sehr nützlich.
Sergi
11
Seien Sie nicht zu schnell, um dies auf Fehlanpassungen mit variabler Inhaltslänge zurückzuführen. ab meldet den HTTP-Statuscode 500 nicht als Fehler in seiner Zusammenfassung. Der Grund für die Längeninkongruenz könnte sein, dass Sie einen echten Fehler haben. Sie können -v 4 verwenden, um weitere Informationen zu erhalten (bessere Weiterleitung an eine Datei, da viel Ausdruck vorhanden ist).
Tal Lev-Ami
3
Tatsächlich wird es im ab-Handbuch hier erklärt: httpd.apache.org/docs/current/programs/ab.html "Wenn sich die Dokumentlänge während des Tests ändert, wird die Antwort als Fehler angesehen."
Joeахар Joe
132

Um das Problem mit anderen Worten zu beschreiben:

Das Apache-Benchmarking-Tool (ab) geht davon aus, dass die Länge des Antwortinhalts während des gesamten Tests gleich ist. Es speichert die Inhaltslänge der ersten Antwort. Wenn eine der weiteren Antworten eine andere Inhaltslänge hat, führen sie zu "Längenfehlern".

Der folgende Apache-Fehlerbericht scheint dies zu bestätigen: ASF-Fehler 42040

Zusammenfassung : Wenn Sie Inhalte mit variabler Länge bereitstellen, sollten Sie diese Art von Ab-Anforderungsfehlern wahrscheinlich ignorieren.

Bearbeiten : Ich habe kürzlich festgestellt, dass der abBefehl eine neue (zumindest für mich) Option hat:

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

Ich kann es in ab Version 2.3 <$ Revision: 1528965 $> sehen, aber nicht in ab Version 2.3 <$ Revision: 655654 $> , daher wurde es wahrscheinlich vor relativ kurzer Zeit hinzugefügt.

Dariusz Walczak
quelle
4
Für jeden auf einem Mac besteht die Möglichkeit, dass Ihre Version von ab hinterherhinkt und -l nicht akzeptiert. Sie können von der Quelle oder über Homebrew installieren, aber "Brew Install Ab" funktioniert nicht, da es Teil des Apache-Pakets ist. Sie können es mit "Brew Install Homebrew / Apache / Ab" installieren.
Netpoetica
8

Es tut mir leid, eine alte Frage erneut zu beantworten, aber es war die erste, die in Google auftauchte. Manchmal wurde der von ab gemeldete Längenfehler durch ein echtes Problem verursacht: Wenn die Verbindung serverseitig geschlossen wird, bevor die im Content-Length-Header deklarierte Gesamtmenge an Bytes vom Client nicht empfangen wurde. Dies kann passieren, wenn sich zwischen dem Client und dem Server andere Parteien befinden, z. B. naive handgefertigte Load Balancer (mein Fall).

zentrunix
quelle