2012-04-21 131 views
28

我开始在JMeter中编写一些基本测试,并且感到惊讶的是测量结果与Apache ab中的测量结果差别很大。JMeter或Apache ab可以获得正确的测量结果吗?

我有一个千兆局域网连接运行Nginx的英特尔i7服务器和运行JMeter或ab的i5测试机器。最初,我只是测试开箱即用的Nginx主页响应率。

ab -c 1 -n 100 http://testserver.local/ 

Document Path:  /
Document Length:  151 bytes 

Concurrency Level:  1 
Time taken for tests: 0.078 seconds 
Complete requests:  100 
Failed requests:  0 
Write errors:   0 
Total transferred:  38400 bytes 
HTML transferred:  15100 bytes 
Requests per second: 1280.77 [#/sec] (mean) 
Time per request:  0.781 [ms] (mean) 
Time per request:  0.781 [ms] (mean, across all concurrent requests) 
Transfer rate:   480.29 [Kbytes/sec] received 

这个结果是一致地重现,+/-百分之几。


在JMeter的,我具有包含1-用户100环线程组:

  • HTTP头管理器设置的Accept-Encoding:gzip的
  • 一个HTTP GET /采样
  • 总结报告收听者

只有100个样本,每次运行结果都不一致。但最令人吃惊的事实是吞吐量低至每秒40个请求(不是1280个)。最高的记录率是1030,这只有当我增加到10000个样本时才能达到。

我是否认为JMeter是简单负载测试的错误工具,因为它的开销太高,无法进行准确的测量?

+1

+1,但我认为你的结论是正确的。 – 2012-04-21 15:58:02

回答

48

Jmeter告诉你多久每个请求实际上了。 AB只是做一些非常基本的数学来获得整体平均值。所以,对你的问题的直接回答是,jmeter能够正确地做出决定,而且只是通过给你所有的意思来粗略猜测。

但是,当然,如果您将两个工具并排放置并对速度进行评分,那么ab显然会超出jmeter。 Jmeter做得更多,它记录更多的数据并且处理更多的逻辑,因此需要更长的时间才能完成单个请求。简单的事实是,Jmeter是一个全功能的负载测试工具,AB不是。

的事情是,一个负载测试工具的目的不是要块上最快的孩子,取而代之的则是对能够建立排序的真实表示加载的应用程序可能会被击中当它变为现实时。在这方面,jmeter胜手,所以这取决于你的要求。如果你只是想用尽可能少的硬件来生成尽可能多的请求,那么ab是一个不错的选择,但是如果你想要建立一个有代表性的测试,使用事务旅程,条件逻辑和其他各种有用的东西,那么jmeter就是要走的路。可以这样想:它们都是Apache项目,但我认为AB是为了测试Apache Web服务器JMeter而设计的,目的是测试Tomcat。

现在,我猜测jmeter产生不一致的结果,因为它正在运行的机器上达到限制。我敢打赌,你在GUI模式下运行,并且至少有一个监听器处于活动状态,就像你要求该工具做了很多事情一样。如果你需要很高的请求率,那么Jmeter就有一个精简和平均模式。通常情况下,对于大容量来说,最好的做法是在命令行上用很少的听众执行测试;有很多关于这个主题的信息在apache jmeter网站上。

另一点你应该考虑,如果你真的进入负载测试,是为了真正从这种事情中受益,你需要首先决定什么样的负载,你需要你的网站支持,只有那么你应该设计一个代表这个的测试。这是通过使用起搏和模拟等待时间来实现的。以讲述一个线程是应该走开,并以最快的速度,因为它可能可以运行的问题是,作为当地条件允许的话它会快速迭代,但会有总是是东西,穿的休息,甚至ab是有限的;无论多么轻巧的工具,它仍然有东西。但是,如果您对请求进行排序,那么您将消除此问题并作为一个相当有用的额外奖励,从而最终实现运行之间以及代码构建之间的一致性,因此即使您的服务器加速或减速(通过更改代码库)你的测试仍然会产生相同的请求率 - 这对基准测试非常有用。

如果你想利用JMeter的进一步再看看恒吞吐量计时器,然后使用多线程建立交通的需要来表示的水平。

+0

ApacheBench(我同意“基本数学”)可能会产生较少的数据,但这意味着它无法正确计算平均值。 OP使用'ab'平均每秒报告1280个请求。他从JMeter报告的最高是1030.尽管我同意你列出的关于JMeter的各种好处,但我不能忽视JMeter不像ApacheBench那样让Web服务器饱和的明显事实。出于这个原因,我发现你的断言“jmeter正确”可疑。如果JMeter说得对,它应该至少产生一个可比较的平均值。 – 2016-01-10 06:07:01

+0

嘿汤姆,实际上我从来没有说过从ab的意思是不正确的,只是它只是数学的意思,而不是像JMeter给出的结果的更详细的分解。回覆。关于谁可以每秒产生最多请求的其他观点,我可以参考我关于该区块中速度最快的孩子的第3段,但基本上OP是混淆的,因为他没有考虑到他的测试硬件限制。谢谢。奥利弗 – 2016-01-11 10:22:08

3

在你的设置,JMeter是速度比它可以饱和你的Web服务器本身饱和。对较小的硬件相对较重的Java应用程序

您正在运行优越的硬件和一个非常优化的C Web服务器基准标记它。优化后的C机器代码将(可能)总是比Java字节代码更快。 JMeter无法跟上Nginx的步伐,因此会给你带来奇怪的结果,因为它遇到硬件限制。 Java在后台管理硬件资源方面做了很多很棒的事情,但在极端的资源使用情况下也会产生不可预知的行为。另一方面,ApacheBench是一个轻量级的C程序,它可以使服务器达到饱和,并且可以产生一致的结果,因为在饱和Web服务器之后它具有过剩容量。

JMeter是非常适合那些需要一些时间来处理请求基准标记重-ER动态应用。它提供的所有额外数据都可以帮助像这样的网络应用程序。当您在高度优化的Web服务器上处理静态文件服务(仅仅是Web服务器可以做的最快的事情)时,您需要足够快的工具来跟上。

0

正如第一个答案中所述,关键字“要求”。 JMeter是测试服务器网页的更好选择。例如,它可以发送请求序列,为每个序列生成不同的请求,解析HTML响应并从HTML中加载图像和脚本的内容。 AB是对REST API的测试,你需要的是服务器响应尽可能地快,并成为许多要求尽可能更好的选择,在两个序贯要求等之间没有连接 所以,AB确实能够产生比JMeter和同一台客户机上的同一台服务器有更多的请求。

相关问题