我开始在JMeter中编写一些基本测试,并且惊讶于测量结果与Apache ab的测量结果有很大不同。
我有一个千兆局域网连接运行Nginx的Intel 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循环线程组,其中包含:
只有100个样本,每次运行时都会产生非常不一致的结果。但最令人吃惊的事实是报告吞吐量低至每秒40个请求(而不是1280)。最高记录率为1030,只有当我增加到10,000个样本时才能实现。
我是否认为JMeter是简单负载测试的错误工具,因为它的开销太高而无法进行精确测量?
答案 0 :(得分:60)
Jmeter会告诉您每个请求实际需要多长时间。 AB只是做了一些非常基本的数学计算来得到整体平均值。因此,对你的问题的直接回答是,jmeter正确,ab只是粗略猜测,给你所有的平均值。
但是,当然,如果你并排放置这两个工具并对它们进行速率评估,那么很明显ab将会执行jmeter。 Jmeter只是做得更多,它记录更多数据并处理更多逻辑,因此转换单个请求需要更长时间。简单的事实是Jmeter是一个功能齐全的负载测试工具,AB很好,不是。
问题是,负载测试工具的目标不是成为块中最快的孩子,而是能够建立一个真实的表示,加载您的应用程序它可能会在它上线时被击中。在这方面,jmeter胜出,所以它实际上取决于你的要求。如果您只想使用最少量的硬件生成尽可能多的请求,那么ab是一个不错的选择,但如果您想构建具有代表性的测试,具有事务性旅程,条件逻辑和各种其他有用的东西,那么jmeter是要走的路。想象一下:它们都是Apache项目,但我认为AB是为了测试apache web服务器而设计的,但JMeter是为了测试Tomcat而设计的。
现在,我猜测jmeter产生的结果不一致,因为它在运行它的机器上达到了极限。我打赌你是在GUI模式下运行并且至少有一个监听器处于活动状态,这样你就要求该工具做很多事情。如果您需要高比率的请求,那么Jmeter具有精简和平均模式。通常,对于大容量,最佳实践是在命令行执行测试,只有很少的侦听器;在apache jmeter网站上有很多关于这个主题的信息。
如果您真的进行负载测试,您应该考虑的另一点是,为了真正从这类事情中获益,您需要首先确定您的网站需要支持哪种负载,然后才能你应该设计一个代表这个的测试吗?这是通过使用调步和模拟等待时间来实现的。告诉线程的问题应该是尽可能快地消失并且它会以本地条件允许的速度迭代,但是总是是放置的东西休息时间,甚至ab都是有限的;无论工具多么轻巧,它仍然可以某种东西。但是如果你调整了你的请求,那么你就可以解决这个问题,并且作为一个相当有用的额外奖励,你最终会得到运行之间和代码构建之间的一致性,所以即使你的服务器加速或减速(代码库的更改)您的测试仍然会产生相同的请求率 - 这对于基准测试非常有用。
如果你想进一步使用JMeter,那么看看Constant Throughput Timer然后使用多个线程来建立你需要代表的流量水平。
答案 1 :(得分:5)
在您的设置中,JMeter的饱和速度超过了您的网络服务器的饱和度。
您正在高级硬件上运行一个非常优化的C Web服务器,并在较小的硬件上使用相对较重的Java应用程序进行标记。优化的C机器代码(可能)总是比Java字节码更快。 JMeter无法跟上Nginx的步伐,因此在遇到硬件限制时会给你带来奇怪的结果。 Java在后台管理硬件资源时做了很多好事,但在极端资源使用时也会产生不可预测的行为。另一方面,ApacheBench是一个足够轻的C程序,它可以使服务器饱和,并且可以产生一致的结果,因为它在使您的Web服务器饱和后具有过剩的容量。
JMeter非常适合需要一些时间来处理请求的繁重的动态应用程序。它提供的所有额外数据有助于此类网络应用。当您在高度优化的Web服务器上处理静态文件服务(Web服务器可以做的最快的事情)时,您需要一个足够快的工具来跟上。
答案 2 :(得分:0)
正如在第一个答案中已经说明的那样,关键字“要求”。 JMeter是测试服务于网页的服务器的更好选择。例如,它可以发送请求序列,为每个序列生成差异请求,解析HTML响应并从HTML加载图像和脚本的内容。 AB是REST API测试的最佳选择,您需要服务器尽可能快地响应并尽可能多地提供请求,两个后续请求之间没有连接等。 因此,AB确实能够生成比JMeter更多的请求与来自同一客户端机器的相同服务器。