我已经使用 JMeter 几年了,并且一直在使用 Apache HTTPClient 采样器实现,因为它似乎是推荐的实现,而 Apache HTTPClient 是一个成熟的组件。然而,最近(而且很偶然),我发现 Java 实现似乎性能更好,可扩展性更好。
我正在针对内部开发的 java 服务器应用程序进行测试。将 JMeter 从使用 HTTP Sampler 的 HTTPClient4 实现切换到 Java 实现会产生高达 400%-450% 的吞吐量。我已经测试了 2.7 和 2.9 版本(在 2.9 中,HTTPClient4 现在是 HTTP 采样器的默认实现)。我正在使用一台相当强大的机器来托管运行 Red Hat Enterprise Linux (2.6.32-358.el6.x86_64) 的 JMeter(双 Intel(R) Xeon(R) E5-2640 0 @ 2.50GHz,6 核,超线程) ) 和一台相同的机器来托管正在测试的服务器应用程序。
我运行了一系列测试,将虚拟用户负载从 1 扩展到 300,步骤:1、10、25、50、100、150、200、250 和 300。每个测试都是离散的,而不是连续的斜坡。使用 HTTPClient 采样器时,查看顶部,我可以看到 JMeter 的使用率在 700%-1100% 之间,无论虚拟用户负载如何(当然单用户除外)。通过 Java 实现,我看到更高的 CPU 利用率(超过 1600%)。重要的是要注意测试是相同的,因为我只更改 jmx 文件中的 HTTP 实现从一个测试到另一个测试,没有别的。被测服务器重新启动测试以测试以使所有事情公平。
监控被测服务器我可以看到,使用 Java HTTP Sampler 的 JMeter 的 CPU 利用率也高于 HTTPClient4 实现。建议 Java impl 比 HTTPClient4 并发发送更多请求。在较高的用户负载下,使用 HTTPClient4 impl,被测服务器最多以 100% 的 CPU 利用率运行。建议它一次只使用一个 cpu/core/hardware 线程。也许重要的是要注意请求的响应时间非常快。第 90 个百分位的响应时间在 2-25 毫秒范围内。
我在 google、here 和其他网站上进行了研究以确定原因(如果时间允许,我可能会尝试分析 JMeter)。我最初的理论是 Java impl 在重用连接方面比 HTTPClient 更有效?或者功能丰富的 HTTPClient 会带来性能损失?我想我的问题有两个:1)其他人经历过这个吗?2) 任何人对为什么 Java impl 似乎表现得更好有任何理论或解释吗?
谢谢!