47

我开始在 JMeter 中编写一些基本测试,并惊讶于测量结果与 Apache ab 的测量结果如此不同。

我有一个千兆 LAN 连接运行 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 循环线程组,其中包含:

  • HTTP 标头管理器设置 Accept-Encoding: gzip
  • 一个 HTTP 获取/采样器
  • 总结报告监听器

只有 100 个样本,每次我运行它都会得到非常不一致的结果。但最令人吃惊的事实是,吞吐量报告低至每秒 40 个请求(而不是 1280)。最高记录率是 1030,这只有在我增加到 10,000 个样本时才实现。

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

4

3 回答 3

68

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,请查看恒定吞吐量计时器,然后使用多个线程来构建您需要表示的流量级别。

于 2012-04-22T01:29:17.090 回答
7

在您的设置中,JMeter 使自身饱和的速度比它使您的 Web 服务器饱和的速度更快。

您正在高级硬件上运行一个非常优化的 C Web 服务器,并在较小的硬件上使用相对较重的 Java 应用程序对其进行基准测试。优化的 C 机器代码(可能)总是比 Java 字节码快。JMeter 无法跟上 Nginx,因此在遇到硬件限制时会给您带来奇怪的结果。Java 在后台做了很多很好的事情来管理硬件资源,但也会在极端的资源使用情况下产生不可预测的行为。另一方面,ApacheBench 是一个足够轻量级的 C 程序,它可以使服务器饱和并且可以产生一致的结果,因为它在使您的 Web 服务器饱和后具有过剩的容量。

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

于 2016-01-10T05:57:05.337 回答
1

正如在第一个答案中已经说明的那样,关键字“要求”。JMeter 是测试服务于网页的服务器的更好选择。例如,它可以发送一系列请求,为每个序列生成不同的请求,解析 HTML 响应并从 HTML 加载图像和脚本的内容。AB 是 REST API 测试的更好选择,您需要服务器尽可能快地响应并提供尽可能多的请求,两个后续请求之间没有连接等。因此,AB 确实能够生成比JMeter 与来自同一客户端机器的同一服务器。

于 2017-01-03T14:25:17.593 回答