web-dev-qa-db-ja.com

ABを使用した負荷テスト...失敗したリクエストの偽装(長さ)

自分の好奇心のために、サーバーで負荷テストを行うために実行しました:

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

これにより、200秒間に50のキープアライブ接続が開かれ、index.phpのリクエストでサーバーが非難されます。

私の結果では、私は次を得る:

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

32951の「失敗した」リクエストに注意してください。これを理解できません。

テストの実行中、ページの下部のページ読み込み時間が通常の.02ではなく.5と報告されていたにもかかわらず、自宅のコンピューターから完全にWebサイトにアクセスできました。しかし、一度も失敗したリクエストは一度もありませんでした。

では、ABが接続の半分が失敗したと報告するのはなぜですか?そして、その文脈で「長さ:」は何を意味しますか?

ありがとう

201
Franky

気にしないで。 「長さの失敗」は、応答の長さが約半分の時間で異なっていたことを示しています。

内容は動的であるため、おそらくセッション識別子またはそのようなものです。

351
Franky

他の言葉で問題を説明するには:

Apacheベンチマークツール(ab)は、テスト全体を通じて応答コンテンツの長さが同じであると想定しています。最初の応答のコンテンツの長さを保存します。それ以降の応答のいずれかが異なるコンテンツの長さを持っている場合、それらは「長さの失敗」をもたらします。

次のApacheバグレポートでは、次のことを確認しているようです: ASF Bug 4204

Summary:可変長のコンテンツを提供している場合、この種のabリクエストの失敗はおそらく無視すべきです。

Edit:最近、abコマンドに新しい(少なくとも私にとっては)オプションがあることに気付きました:

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

abバージョン2.3 <$ Revision:1528965 $>に表示されますが、abバージョン2.3 <$ Revision:655654 $には表示されません>。したがって、おそらく比較的最近追加されました。

122
Dariusz Walczak

古い質問を復活させてすみませんが、Googleに最初に表示された質問です。 abによって報告される長さエラーは、実際の問題が原因である場合があります。Content-Lengthヘッダーで宣言された合計バイト数がクライアントによって受信されないうちに接続がサーバー側で閉じられた場合。これは、クライアントとサーバーの間に他の関係者、例えば、ナイーブな手作りのロードバランサー(私の場合)がある場合に発生する可能性があります。

8
zentrunix