调查Apache基准测试失败的请求。

55

今天刚开始使用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)

须知:我正在使用Hostgator Linux共享服务器。


看起来这个问题可能已经有答案了:https://dev59.com/nXI_5IYBdhLWcg3wJPZu - Yzmir Ramirez
4个回答

94

这是动态页面的一个问题,因为请求之间内容长度可能会变化。当使用ab测试此类页面时,您需要使用-l选项。

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

3
如果您想对严重缓存的页面进行基准测试,以下是一些有用的建议。例如,在我的情况下,由于WordPress和WP Rocket缓存,我得到了不同长度的响应。添加此参数,您将获得一个干净的测试结果。 - Matthew Blancarte
1
版本2.3(ab -V)似乎没有这个“-l”标志(RHEL7)。 - Elijah Lynn
3
运行 ab -v 2 -l 命令可以查看响应结果 - prayagupa
1
我分享一下我的经验,我发现了这个长度错误,即使我所请求的不是一个动态网站,而是一个应该每次返回相同响应的机器学习服务。但进一步调查揭示出,在A/B测试期间,我做了一个训练请求,导致响应在此期间被更改了,因此长度也发生了变化。最终,由于长度不匹配,所有即将到来的请求都被标记为失败。 - hafiz031

44

失败的请求都基于长度 - 也就是未完全匹配字节数的响应数量。这可能是由于动态内容(例如广告等)每次提供的不同所致,因此不必担心。


8
马丁说得对。更有帮助的是,我对我们的生产服务器进行了快速的curl测试:
{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&#47;RRZCf2Zk&#47;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="&#x2713;" /><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="&#x2713;" /><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&#47;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="&#x2713;" /><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="&#x2713;" /><input name="authenticity_token" type="hidden" value="BMZKKUZ3WFhQrCIewQ81VuArEtUp8gc6ccr0Wi3/sqE=" /></div>
{user@staging:~}$ 

请注意,我们看到了一个“content”字符串,其中包含一串漂亮丑陋的字符。请注意,'/'字符在“form”行中出现,在“meta”行中被替换为“/”。这就解释了我的请求长度相差4或8个字符的原因。
很让人烦恼的是,apachebench并不聪明,不能考虑到这一点,但至少我们能看到原因。

有人可以帮我理解“每秒请求数”是否包括失败的请求吗? - Zaheer
1
@Zaheer 最好为此提出一个单独的问题。 - Gogowitsch

1

因为它会返回可变的响应结果,Apache会将第一个响应结果与后续的响应结果进行比较。

您只需要添加以下内容:

ab -v 2 -l

即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接