今日からABを使い始めました。いくつかのABチュートリアルを読んで、自分のサイトの負荷テストを試してみてください。
数回使用した後、失敗したリクエストの数が膨大になりました。失敗したリクエストの意味を説明できますか?この問題の詳細を調査するにはどうすればよいですか?
AB結果の例:
-jailshell-3.2$ ab -n500 -c10 http://www.tweeting.tv/index.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> Apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.Apache.org/
Benchmarking www.tweeting.tv (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests
Server Software: Apache
Server Hostname: www.tweeting.tv
Server Port: 80
Document Path: /index.php
Document Length: 242861 bytes
Concurrency Level: 10
Time taken for tests: 97.846330 seconds
Complete requests: 500
Failed requests: 481
(Connect: 0, Length: 481, Exceptions: 0)
Write errors: 0
Non-2xx responses: 2
Total transferred: 121214449 bytes
HTML transferred: 121003283 bytes
Requests per second: 5.11 [#/sec] (mean)
Time per request: 1956.927 [ms] (mean)
Time per request: 195.693 [ms] (mean, across all concurrent requests)
Transfer rate: 1209.78 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1503 1675.5 1 9036
Processing: 130 393 285.1 319 2382
Waiting: 92 244 226.3 192 2180
Total: 153 1896 1726.2 1121 10374
Percentage of the requests served within a certain time (ms)
50% 1121
66% 3308
75% 3355
80% 3375
90% 3451
95% 3603
98% 4163
99% 9315
100% 10374 (longest request)
N.B. Hostgator Linux共有サーバーを使用しています。
これは動的ページの問題であり、コンテンツの長さがリクエスト間で異なる可能性があるために発生します。このようなページでabを使用する場合は、-l
オプションを使用する必要があります。
-l Accept variable document length (use this for dynamic pages)
失敗した要求はすべて長さに基づいています。これは、指定されたバイト数と正確に一致しなかった応答の数です。これは、毎回異なる方法で配信される広告などの動的コンテンツが原因で発生するため、心配する必要はありません。
マーティンは正しいです。さらに便利なことに、私は本番サーバーに対して簡単なカールを実行しました。
{user@staging:~}$ for i in `seq 1 10`; do curl -sk https://app.copperegg.com/login > /tmp/lb$i.txt ; done
{user@staging:~}$ wc /tmp/lb*
74 239 3316 /tmp/lb1.txt
74 239 3324 /tmp/lb10.txt
74 239 3320 /tmp/lb2.txt
74 239 3316 /tmp/lb3.txt
74 239 3316 /tmp/lb4.txt
74 239 3316 /tmp/lb5.txt
74 239 3320 /tmp/lb6.txt
74 239 3316 /tmp/lb7.txt
74 239 3316 /tmp/lb8.txt
74 239 3316 /tmp/lb9.txt
740 2390 33176 total
{user@staging:~}$ diff /tmp/lb1.txt /tmp/lb10.txt
7c7
< var g_time_offset = new Date().getTime() - 1318965621000;
---
> var g_time_offset = new Date().getTime() - 1318965622000;
15c15
< <meta name="csrf-token" content="bi9pgbUoUQLOwB3V8fT1E40sV06x4914ybLSvnfEeeg="/>
---
> <meta name="csrf-token" content="GL/RRZCf2Zk/AQzRgEW2U4Iv3htD1hodt2qfp4jwIxQ="/>
23c23
< <form accept-charset="UTF-8" action="/authenticate" id="loginForm" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="bi9pgbUoUQLOwB3V8fT1E40sV06x4914ybLSvnfEeeg=" /></div>
---
> <form accept-charset="UTF-8" action="/authenticate" id="loginForm" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="GL/RRZCf2Zk/AQzRgEW2U4Iv3htD1hodt2qfp4jwIxQ=" /></div>
{user@staging:~}$ diff /tmp/lb1.txt /tmp/lb2.txt
7c7
< var g_time_offset = new Date().getTime() - 1318965621000;
---
> var g_time_offset = new Date().getTime() - 1318965622000;
9,10c9,10
< <link href="/stylesheets/application.css?1318747862" media="screen" rel="stylesheet" type="text/css" />
< <script src="/javascripts/cache/application.js?1318747811" type="text/javascript"></script>
---
> <link href="/stylesheets/application.css?1318747582" media="screen" rel="stylesheet" type="text/css" />
> <script src="/javascripts/cache/application.js?1318747448" type="text/javascript"></script>
15c15
< <meta name="csrf-token" content="bi9pgbUoUQLOwB3V8fT1E40sV06x4914ybLSvnfEeeg="/>
---
> <meta name="csrf-token" content="BMZKKUZ3WFhQrCIewQ81VuArEtUp8gc6ccr0Wi3/sqE="/>
23c23
< <form accept-charset="UTF-8" action="/authenticate" id="loginForm" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="bi9pgbUoUQLOwB3V8fT1E40sV06x4914ybLSvnfEeeg=" /></div>
---
> <form accept-charset="UTF-8" action="/authenticate" id="loginForm" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="BMZKKUZ3WFhQrCIewQ81VuArEtUp8gc6ccr0Wi3/sqE=" /></div>
{user@staging:~}$
「醜い」文字列の「コンテンツ」文字列が表示されていることに注意してください。 「/」文字は「フォーム」行にありますが、「メタ」行では「/」に置き換えられています。これにより、リクエストの長さの4文字または8文字の違いが明らかになります。
Apachebenchがこれをスマートに説明できないのはイライラしますが、少なくとも原因はわかります。