基准文档说并发性是指同时完成的请求数量,而请求数量是请求总数。我想知道的是,如果我以20的并发级别发出100个请求,这是否意味着同时对20个请求进行5次测试,或者同时对20个请求进行100次测试?我假设第二个选项,因为下面引用了示例数字..
我很想知道因为我经常在一些测试博客上看到这样的结果:
Complete requests: 1000000
Failed requests: 2617614
这似乎难以置信,因为失败请求的数量高于总请求数。
修改:显示上述数字的网站:http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php
或者可能是它一直在尝试,直到它达到一百万次成功?唔...
答案 0 :(得分:40)
这意味着单个测试共有100个请求,始终保持20个请求打开。我认为你的误解是请求都需要相同的时间,实际上从来都不是这样。 ab不是以20个批量发出请求,而是简单地从20个请求开始,并在每次现有请求完成时发出新请求。
例如,使用ab -n 10 -c 3
进行测试将以3个并发请求开始:
[1, 2, 3]
假设#2首先完成,ab用第四个替换它:
[1, 4, 3]
...然后#1可能会完成,取而代之的是第五个:
[5, 4, 3]
......然后#3结束:
[5, 4, 6]
......依此类推,直到请求总共发出了10个请求。 (当请求8,9和10完成时,并发性当然会逐渐减少到0.)
有意义吗?
至于你的问题,为什么你看到的结果有更多的失败而不是总要求...... 我不知道答案。我不能说我见过这个。你可以发布显示这个的链接或测试用例吗?
更新:在查看the source时,ab会跟踪四种类型的错误,这些错误详见“失败请求:...”行:
err_conn
)当ab无法设置HTTP连接时增加err_recv
)当ab失败时读取连接失败err_length
)当响应长度与收到的第一个良好响应的长度不同时递增。err_except
)当轮询连接套接字时ab看到错误时增加(例如连接被服务器终止?)这些发生时的逻辑以及它们的计数方式(以及跟踪总bad
计数的方式)必然有点复杂。看起来ab的当前版本应该只针对每个请求计算一次失败,但是该文章的作者可能正在使用以某种方式计算不止一个的先前版本?这是我最好的猜测。
如果你能够重现这种行为,绝对是file a bug。
答案 1 :(得分:0)
我没有看错。失败的请求每个都会增加多个错误。这就是ab
的工作方式。
有各种静态声明的固定长度的缓冲区。 结合命令行参数的延迟解析, 来自服务器和其他外部输入的响应头, 这可能会咬你。
您可能会注意到,例如前一个节点结果对3个错误计数器的计数相似。最有可能的是,从10万个请求中,只有8409个失败而不是25227。
Receive: 8409, Length: 8409, Exceptions: 8409