Cassandra和G1垃圾收集器阻止世界事件(STW)

时间:2017-10-04 15:33:57

标签: cassandra garbage-collection cassandra-3.0 g1gc

我们有一个6节点的Cassandra集群正在大量使用。我们已经处理了很多垃圾收集器停止世界事件,在我们的节点中可能需要50秒,同时Cassandra Node没有响应,甚至没有接受新的登录。

额外细节:

  • Cassandra版本:3.11
  • 堆大小= 12 GB
  • 我们正在使用具有默认设置的G1垃圾收集器
  • 节点大小:4个CPU 28 GB RAM
  • 所有节点的G1 GC行为都相同。

非常感谢任何帮助!

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

修改1:

检查对象创建统计信息,它看起来并不健康。

enter image description here

编辑2:

我尝试使用 Chris Lohfink 建议的设置,这是GC报告:

使用CMS建议设置 http://gceasy.io/my-gc-report.jsp?p=c2hhcmVkLzIwMTcvMTAvOC8tLWdjLmxvZy4wLmN1cnJlbnQtLTE5LTAtNDk=

使用G1建议设置 http://gceasy.io/my-gc-report.jsp?p=c2hhcmVkLzIwMTcvMTAvOC8tLWdjLmxvZy4wLmN1cnJlbnQtLTE5LTExLTE3

行为基本保持不变:

  1. Old Gen开始填满。
  2. 如果没有完整的GC和STW事件,GC无法正常清理。
  3. 完整的GC开始需要更长时间,直到节点完全没有响应。
  4. 我将获得cfstats输出以获得最大分区大小和每次读取的逻辑删除,并再次编辑帖子。

2 个答案:

答案 0 :(得分:3)

你看过使用Zing吗?像这样的Cassandra情况是一个经典的用例,因为Zing从根本上消除了Cassandra节点和集群中所有与GC相关的故障。

您可以在我最近的#34;了解GC"中看到有关如何/为何的详细信息。来自JavaOne(https://www.slideshare.net/howarddgreen/understanding-gc-javaone-2017)的讨论。或者只是跳过幻灯片56-60,了解Cassandra特定的结果。

答案 1 :(得分:2)

在不知道您的现有设置或可能的数据模型问题的情况下,继续猜测一些保守的设置,以尝试减少疏散暂停,因为没有足够的空间(检查gc日志):

-Xmx12G -Xms12G -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:MaxGCPauseMillis=500 -XX:-ReduceInitialCardMarks -XX:G1HeapRegionSize=32m

这还应该有助于减少更新记忆集的暂停,这会成为问题并减少可能成为问题的巨大对象,具体取决于数据模型。 确保未设置-Xmn

带有C *的12Gb可能更适合使用CMS来实现其价值,您可以获得更好的吞吐量。随着时间的推移,需要注意可以分配的相当大的对象的碎片。

-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=55 -XX:MaxTenuringThreshold=3 -Xmx12G -Xms12G -Xmn3G -XX:+CMSEdenChunksRecordAlways -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSWaitDuration=10000 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCondCardMark 

很可能是数据模型的问题或者您的配置不足。