Jmeter报错:java.lang.OutOfMemoryError: GC overhead limit exceeded。

6
我正在使用 Jmeter 对部署在 AWS EC2 实例上的应用程序进行工作负载注入。测试必须非常庞大:持续时间为10小时,工作负载配置具有双峰形状,每5分钟大约有2600个请求。实际上,我有一个 m3.xlarge 实例,在其中部署了应用程序,并且有8个 m3.xlarge 实例,每个实例都运行着一个 jmeter 实例。使用 Python 脚本,将要注入的工作负载分配给了这8个客户端实例,因此例如,如果原始工作负载需要注入800个请求,则每个 Jmeter 实例将注入100个请求。完整的测试如我所说持续10小时,每个时间段为5分钟。每5分钟应用一次轻微的工作量变化。实际上,我从每个 jmeter 实例中得到的 java.lang.OutOfMemoryError: GC overhead limit exceeded 错误是立即在测试开始后出现的,同时没有请求到达应用程序。我在线上和 stackoverflow 上阅读了很多资料,并得出可能的错误可能是:

  • JVM 堆大小过低 -> 我解决了这个问题,在每个 jmeter 实例的 jmeter.bat 文件中设置了以下内容:

    set HEAP=-Xms4g -Xmx4g

    set NEW=-XX:NewSize=4g -XX:MaxNewSize=4g

  • 代码中的一些错误导致垃圾回收器继续无用地使用。 因此,我从测试中删除了所有 jmeter 监听器。 特别是我在使用 TableVisualizer、ViewResultsFullVisualizer、StatVisualizer 和 GraphVisualizer。

无论如何问题仍然存在。 我真的不知道该怎么解决它。 我知道10小时的测试和2600个请求可能是一个非常重的测试,但我认为应该有一种方法来执行它。 我正在使用 EC2 m3.xlarge 实例,因此如果有用的话,我甚至可以将堆大小提高到8G,或者在更多客户端之间分割工作负载,因为我正在使用 Spot 实例,所以我不会支付太多费用。但是由于我已经将客户端实例数从4个增加到8个以解决问题,但现在仍不起作用,我有点困惑,并希望在继续获取更多资源之前先得到您的建议。 非常感谢您提前的协助。


是的,JMeter是一个臭名昭著的资源占用量大的软件。一定要关闭所有在测试期间累积数据的组件。尽可能为它分配更多的堆内存。 - Marko Topolnik
在 jmeter.bat 设置中将 HEAP 和 NEW 参数都修改为 2/4/8g 是正确的吗? - Michele Guerriero
“NEW”参数看起来不是正确的做法。如果你遇到了OOME,那意味着有很多旧对象被保留下来,而这些“NEW”参数会强制JVM将所有东西都视为新对象。这意味着Minor GC将非常缓慢。通常最好让JVM动态调整代的大小。 - Marko Topolnik
我该如何获得这个?我刚刚尝试了以下设置:set HEAP=-Xms8g -Xmx8gset NEW=-XX:-UseGCOverheadLimit -XX:-UseGCOverheadLimit但它没有起作用。我知道测试持续10小时,每个jmeter实例必须同时启动300个请求的一批,但我想肯定有方法可以做到这一点。 - Michele Guerriero
1个回答

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接