哪个是更好的基准测试策略:本地机器与远程机器

Which is the better benchmarking strategy: local machine vs remote machine

今天我争论了哪种基准测试策略更好:本地机器还是远程机器。我想知道关于该主题的其他一些意见。这是一个更笼统的问题,但在这种情况下,它是一个 java 项目。

测试是关于一些模板引擎的性能。 在 30 秒的预热阶段后,基准 运行s 120 秒,100 个线程。

测试页面有静态部分和动态部分。像 table 和列表中的随机项目,但例如静态 header(无数据库操作)。

塞纳里奥 1:

Web 服务器和基准测试工具 运行 在同一台机器上。 测试是用 ab 和 jmeter 进行的。

专业论据:

反对论点:

塞纳里奥 2:

一台远程机器测试另一个系统:

专业论据:

反对论点:

首先我想知道哪种方法更好。其次,如果某些参数无效。或者最后它甚至都没有关系。我想知道这两种变体中任何一种的其他论点。我希望这个问题不会被关闭,因为我认为这不是笼统的。一个选项必须是更好的选项。

几乎在所有情况下,场景 2 都将更接近生产行为。我认为,针对场景 1 列出的缺点实际上会使任何结果无效。但是,只要您与该方法保持一致,您就应该能够使用结果进行比较,即使它们与您期望从生产中看到的结果不匹配。

解决方案 2 的缺点:

  • 生产系统不是一个理想的环境。

如果您要加载测试产品,则开始时还有其他问题。

  • 网络可​​能会降低结果。

虽然这可能是真的,但分布式内部测试环境的网络仍然比您的客户从外部来源获得的网络要好。在几乎所有情况下,您都希望进行带宽网络模拟以确保类似生产的行为。

要完成此操作,请在 jmeter.properties 文件中查找以下行:

# Define characters per second > 0 to emulate slow connections
#httpclient.socket.http.cps=0
#httpclient.socket.https.cps=0

这将限制每个 JMeter 线程的 "bandwidth"。 (引用是因为限制不会发生在网络级别)做一个简单的研究,看看 CPS 对您的应用程序意味着什么。


简短答案:

始终尝试在分布式设置中进行测试,因为这样您会更加灵活。此外,请考虑您需要多个负载生成器机器来实际对目标施加压力的场景。在那种情况下你别无选择,所以我认为 "best practice" 是用单独的负载生成器机器配置隔离测试环境。

此外,为了有效地最大化每台负载生成器机器的输出,建议为负载生成器机器自定义打开文件描述符限制 (ulimits) 和 JVM 内存设置。在大多数情况下,这些配置对于应用程序服务器是不可接受的。

希望对您有所帮助,如果我可以进一步详细说明,请告诉我, -糊涂了