【问题标题】:Cassandra and G1 Garbage collector stop the world event (STW)Cassandra 和 G1 垃圾收集器停止世界事件 (STW)
【发布时间】:2018-03-16 01:52:51
【问题描述】:

我们有一个利用率很高的 6 节点 Cassandra 集群。我们一直在处理垃圾收集器停止世界事件,这在我们的节点中可能需要长达 50 秒的时间,同时 Cassandra 节点没有响应,甚至不接受新的登录。

额外细节:

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

任何帮助将不胜感激!


编辑 1:

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


编辑 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 开始需要更长的时间,直到节点完全没有响应。

我将尽快获取 cfstats 输出以获得最大分区大小和每次读取的墓碑,然后再次编辑帖子。

【问题讨论】:

  • 堆在 GC 增加之后,因此您的应用程序只是需要更多内存,您有泄漏或 cassandra 的配置方式以 G1 无法跟上的方式突发分配。仅凭这些图表无法区分这些案例。
  • 您当前的 GC 设置是什么?
  • 您能否包含您的 cfstats 输出以获得最大分区大小和每次读取的墓碑?扫描 tombstone 和反序列化大型分区索引是高 obj 分配率的常见原因。同样在评论之上,很难说出如何在不知道当前设置的情况下改进您的 GC
  • @ChrisLohfink 我试图使用默认的 G1 GC 设置,我确实使用了 XX:MaxGCPauseMillis,但没有任何改变。我使用 G1 和 CMS 的推荐设置编辑了带有 GC 报告的帖子,我将尽快获得您询问的信息。
  • @the8472 看起来像是内存泄漏 (plumbr.eu/blog/memory-leaks/…),你能举个例子说明我可以检查哪些 Cassandra 设置吗?

标签: cassandra garbage-collection cassandra-3.0 g1gc


【解决方案1】:

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

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

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

12Gb 与 C* 可能更适合使用 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 

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

【讨论】:

    【解决方案2】:

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

    您可以在我最近来自 JavaOne (https://www.slideshare.net/howarddgreen/understanding-gc-javaone-2017) 的“理解 GC”演讲中看到有关如何/为什么的一些详细信息。或者直接跳到幻灯片 56-60 了解 Cassandra 特定的结果。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2017-05-24
      • 2014-02-19
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      相关资源
      最近更新 更多