【问题标题】:GC overhead limit exceeded with storm topology风暴拓扑超出 GC 开销限制
【发布时间】:2016-07-22 15:07:27
【问题描述】:

我遇到了拓扑问题,我使用此命令在本地模式下运行它

mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=trident.MyTopology 

得到了

Async loop died!java.lang.OutOfMemoryError: GC overhead limit exceeded

你能帮忙吗?如果您需要任何数据来帮助您,请告诉我

我认为storm.yaml在这里并不重要,因为这个错误在本地不是生产中或者我错了?

 Selection  
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
* 1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/java-6-oracle/jre/bin/java          1062      manual mode
  3            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode

提前致谢

【问题讨论】:

标签: maven apache-storm


【解决方案1】:

看起来 Maven 需要更多的堆空间。这可能是由于 Maven 中的问题,或者您的构建对于默认参数来说太大了。无论哪种方式,您都可以尝试使用以下方法添加更多堆空间:

export MAVEN_OPTS="-Xmx3000m"
mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=trident.MyTopology 

这将给 Maven 约 3GB。您可以或多或少地尝试一下,看看哪种方法最适合您的情况。

有更多的细节和想法: Maven Out of Memory Build Failure

【讨论】:

  • 感谢您的回复,我在 GC 消息“WARN org.apache.storm.zookeeper.server.persistence.FileTxnLog - fsync-ing SyncThread:0 中的预写日志之前收到了这一行:0 花了 1220 毫秒将对操作延迟产生不利影响。请参阅 ZooKeeper 故障排除指南“这是否意味着我也应该使用您的解决方案或者它是不同的问题?
  • 这可能表明您仍有 GC 问题。如果您有 3 GB,则此处可能存在内存泄漏。
【解决方案2】:

很难猜测拓扑有什么问题。 异常告诉你GC运行频繁,你可以尝试增加worker heap(“worker.childopts”设置)。 其他解决方案是限制拓扑同时使用的元组数量。 (“topology.max.spout.pending”设置)但这只有在你的拓扑支持acking时才有效。您能否提供有关您正在运行的拓扑以及您正在使用的“worker.childopts”、“topology.max.spout.pending”设置的更多信息?

【讨论】:

  • 感谢您的回复,我的worker.childopts: "-Xmx4048m -XX:MaxPermSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -Xloggc:/usr/local/storm/ logs/gc-storm-worker-%6700%.log”和“topology.max.spout.pending 为 50000000
  • topology.max.spout.pending 50,000,000 - 这太多了。这意味着如果您启用了确认,您的拓扑可以同时使用 50kk 个元组并跟踪它们。我想这就是你的OOM异常的原因。尝试从较小的数字(10,000 甚至 1,000)开始,看看会发生什么。
  • 感谢您的回复。好的,我会试试的,但是这个项目在这个配置上与我合作得很好,得到的结果是大约 11 GB,但我更新了代码,我希望得到更多的数据,我应该使用其他配置还是什么?对这个问题也很抱歉,增加或减少 spout.pending 有什么用?或者它们对结果有什么影响?
  • 更少的 max.spout.pending - 你需要的内存更少,这是肯定的。更改此参数并不总是会影响拓扑的性能。在某些时候,增加待处理的元组不会产生任何积极影响。那点在哪里只有通过测试才能知道。所以,试着从小数字开始。
  • 非常感谢,我现在正在尝试 10,000,看看它是否运行良好,但我想确保不会影响性能,但我什么时候可以使用更多最大值。 spout.pending ?
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2013-08-06
  • 1970-01-01
  • 2017-12-27
  • 2013-07-13
  • 2018-03-29
  • 2012-04-02
  • 1970-01-01
相关资源
最近更新 更多