228

为了我自己的好奇心,在我的服务器上进行一些负载测试,我运行了:

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

这会打开 50 个保持活动连接,持续 200 秒,然后用 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“失败”请求。我无法弄清楚这一点。

随着测试的运行,我可以从我的家用电脑完美地访问我的网站,尽管页面底部的页面加载时间报告为 0.5 而不是通常的 0.02。但是,我从来没有一次失败的请求。

那么为什么 AB 会报告一半的连接失败呢?在这种情况下,“长度:”是什么意思?

4

3 回答 3

386

没关系。“长度失败”仅表示响应长度的大约一半时间不同。

由于内容是动态的,它可能是会话标识符或类似的东西。

于 2009-02-23T21:36:41.070 回答
149

换句话说,描述这个问题:

apache 基准测试工具 (ab) 假定响应内容的长度在整个测试期间是相同的。它存储第一个响应的内容长度。如果任何进一步的响应具有不同的内容长度,它们会导致“长度失败”。

以下 apache 错误报告似乎证实了这一点:ASF Bug 42040

摘要:如果您正在提供任何可变长度的内容,您可能应该忽略这种 ab 请求失败。

编辑:我最近注意到该ab命令有一个新的(至少对我而言)选项:

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

我可以在ab Version 2.3 <$Revision: 1528965 $>中看到它,但在ab Version 2.3 <$Revision: 655654 $> 中看不到它,所以它可能是最近才添加的。

于 2011-10-11T19:10:22.367 回答
10

很抱歉复活了一个老问题,但这是第一个出现在 Google 中的问题。有时,ab 报告的长度错误可能是由一个实际问题引起的:如果在客户端没有收到 Content-Length 标头中声明的总字节数之前,连接在服务器端关闭。如果客户端和服务器之间有其他方,例如天真的手工负载平衡器(我的例子),就会发生这种情况。

于 2013-09-24T18:27:56.607 回答