Cassandra:在为集群引导新节点时,会出现长时间的Par New GC暂停

7
我曾经遇到一个问题,当引导新节点到Datastax Enterprise Cassandra集群(版本:2.0.10.71)时,这个问题经常发生。
当启动新的要引导的节点时,引导过程开始从集群中的其他节点流式传输数据。在短时间内(通常为1分钟或更短时间) - 集群中的其他节点显示高的Par New GC暂停时间,然后节点从集群中掉落,失败了流会话。
INFO [主要] 2015-04-27 16:59:58,644 StreamResultFuture.java (第91行) [Stream #d42dfef0-ecfe-11e4-8099-5be75b0950b8] 开始与/10.1.214.186进行流会话 INFO [GossipTasks:1] 2015-04-27 17:01:06,342 Gossiper.java (第890行) InetAddress /10.1.214.186现在已经宕机 INFO [HANDSHAKE-/10.1.214.186] 2015-04-27 17:01:21,400 OutboundTcpConnection.java (第386行) 与/10.1.214.186握手版本 INFO [RequestResponseStage:11] 2015-04-27 17:01:23,439 Gossiper.java (第876行) InetAddress /10.1.214.186现在已经上线
然后在另一个节点上:

10.1.214.186错误[STREAM-IN-/10.1.212.233] 2015-04-27 17:02:07,007 StreamSession.java (line 454) [Stream #d42dfef0-ecfe-11e4-8099-5be75b0950b8]发生了流错误

还可以在日志中看到以下内容:

10.1.219.232信息[ScheduledTasks:1] 2015-04-27 18:20:19,987 GCInspector.java(行116)ParNew的GC:2次收集,118272毫秒,已使用980357368;最大值为12801015808

10.1.221.146信息[ScheduledTasks:1] 2015-04-27 18:20:29,468 GCInspector.java(行116)ParNew的GC:1次收集,154911毫秒,已使用1287263224;最大值为12801015808

似乎每次尝试引导新节点时都会发生这种情况,而且发生在不同的节点上。

我找到了这个相关的票据。https://issues.apache.org/jira/browse/CASSANDRA-6653 我的唯一猜测是,当新节点启动时,会触发大量的压缩,这可能会导致GC暂停时间,我考虑设置concurrent_compactors = 1/2 my total CPU 有人有想法吗?
编辑:关于GC设置的更多细节,在EC2上使用i2.2xlarge节点:

MAX_HEAP_SIZE="12G"

HEAP_NEWSIZE="800M"


JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC" JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC" JVM_OPTS="$JVM_OPTS -XX:+CMSParallelRemarkEnabled" JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=8" JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=1" JVM_OPTS="$JVM_OPTS -XX:CMSInitiatingOccupancyFraction=75" JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly" JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"

增加并发压缩器通常是一个好主意。core_count/2 是一个不错的起点。 - Tobert
@Tobert 我认为 cassandra.yml 的默认设置是被注释掉的 - 这是否意味着它的默认值是无限制的,还是设置为单个压缩器? - petecheslock
尽管我现在注意到我们有多线程压缩功能:false - petecheslock
请关闭多线程。您能否在具有原始设置的节点上粘贴tpstats的输出?我很想看看刷新写入器正在做什么。 - Patrick McFadin
我同意Patrick关于刷新的观点。你可能想看一下这个jira --> https://issues.apache.org/jira/browse/CASSANDRA-8485。你的版本是大于2.0.12吗? - phact
显示剩余5条评论
1个回答

4

在DSE机组的帮助下,我们执行了以下设置:

使用i2.2xlarge节点(8个cpu,60G内存,只有本地SSD)

将Heap New Size增加到512M * num CPU(在我们的情况下为4G) 将memtable_flush_writers设置为8 将concurrent_compactors设置为total CPU / 2(在我们的情况下为4)

通过进行这些更改,我们不再看到引导时ParNew GC时间超过1秒(以前我们看到50-100秒的GC时间)。顺便说一下,我们在正常运行期间不会看到任何ParNew GC时间 - 只有引导期间。


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