Cassandra和G1垃圾收集器停止世界事件(STW)
我们有一个6节点的Cassandra集群,利用率很高。我们一直在处理垃圾收集器停止世界事件,这在我们的节点中可能需要50秒,同时Cassandra节点没有响应,甚至不接受新的登录 额外详情:Cassandra和G1垃圾收集器停止世界事件(STW),cassandra,garbage-collection,cassandra-3.0,g1gc,Cassandra,Garbage Collection,Cassandra 3.0,G1gc,我们有一个6节点的Cassandra集群,利用率很高。我们一直在处理垃圾收集器停止世界事件,这在我们的节点中可能需要50秒,同时Cassandra节点没有响应,甚至不接受新的登录 额外详情: 卡桑德拉版本:3.11 堆大小=12 GB 我们正在使用带有默认设置的G1垃圾收集器 节点大小:4个CPU 28 GB RAM G1 GC行为在所有节点上都是相同的 任何帮助都将不胜感激 编辑1: 检查对象创建统计信息,它看起来一点也不健康 编辑2: 我已尝试使用Chris Lohfin
- 卡桑德拉版本:3.11
- 堆大小=12 GB
- 我们正在使用带有默认设置的G1垃圾收集器
- 节点大小:4个CPU 28 GB RAM
- G1 GC行为在所有节点上都是相同的
编辑1: 检查对象创建统计信息,它看起来一点也不健康
编辑2: 我已尝试使用Chris Lohfink建议的设置,以下是GC报告: 使用CMS建议设置 使用G1建议设置 行为基本上保持不变:
我将尽快获取最大分区大小和每次读取的墓碑的cfstats输出,并再次编辑帖子。在不知道您现有的设置或可能的数据模型问题的情况下,这里猜测一些保守的设置可用于减少因空间不足而导致的疏散暂停(检查gc日志): 这还应有助于减少更新记忆集的暂停(这会成为一个问题),并减少可能成为问题的庞大对象(取决于数据模型)。确保未设置-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
很可能是数据模型或资源调配不足的问题。您是否考虑过使用Zing?像这样的Cassandra情况是一个典型的用例,因为Zing从根本上消除了Cassandra节点和集群中所有与GC相关的故障
在我最近从JavaOne()开始的“理解GC”演讲中,您可以看到一些关于如何/为什么的细节。或者直接跳到幻灯片56-60查看Cassandra特定的结果。GC增加后的堆,因此要么应用程序只需要更多内存,要么存在漏洞,要么Cassandra的配置方式会以G1无法跟上的方式突发分配。这些情况无法单独从这些图表中区分。您当前的GC设置是什么?您可以包括最大分区大小和每次读取的逻辑删除的cfstats输出吗?扫描墓碑和反序列化大分区索引是导致obj分配率高的常见原因。同样在上面的评论中,如果不知道当前的情况,很难说如何提高你的GCssettings@ChrisLohfink我试着使用默认的G1 GC设置,我确实使用XX:MaxGCPauseMillis玩了arround,但没有任何改变。我使用G1和CMS的推荐设置编辑了GC报告,我将尽快获得您询问的信息。@the8472它看起来像内存泄漏(),您能给我一个可以检查Cassandra设置的示例吗?
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=55 -XX:MaxTenuringThreshold=3 -Xmx12G -Xms12G -Xmn3G -XX:+CMSEdenChunksRecordAlways -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSWaitDuration=10000 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCondCardMark