Cassandra:将新节点引导到集群时,Long Par New GC 暂停

Posted

技术标签:

【中文标题】Cassandra:将新节点引导到集群时,Long Par New GC 暂停【英文标题】:Cassandra: Long Par New GC Pauses when Bootstrapping new nodes to cluster 【发布时间】:2015-07-06 11:32:21 【问题描述】:

我发现在将新节点引导到 Datastax Enterprise Cassandra 集群(版本:2.0.10.71)时经常发生的问题

当启动要引导的新节点时,引导进程开始从集群中的其他节点流式传输数据。短时间(通常是一分钟或更短时间)后 - 集群中的其他节点显示较高的 Par New GC 暂停时间,然后节点从集群中退出,导致流会话失败。

INFO [main] 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(第 454 行)[Stream #d42dfef0-ecfe-11e4-8099-5be75b0950b8] 发生流错误

还可以查看日志中的内容:

10.1.219.232 INFO [ScheduledTasks:1] 2015-04-27 18:20:19,987 GCInspector.java(第 116 行)ParNew 的 GC:2 个集合的 118272 毫秒,使用了 980357368;最大值为 12801015808

10.1.221.146 INFO [ScheduledTasks:1] 2015-04-27 18:20:29,468 GCInspector.java(第 116 行)ParNew 的 GC:154911 毫秒用于 1 个集合,使用了 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 我认为默认值在 cassandra.yml 中被注释掉 - 这是否意味着它是无限制的默认值或设置为单个压缩器? 虽然我现在注意到我们有 multithreaded_compaction: false 关闭多线程。您可以将 tpstats 的输出粘贴到具有原始设置的节点上吗?我很想看看同花顺的作家在做什么。 @PatrickMcFadin - 这是一个 nodetool tpstats 输出 - gist.github.com/petecheslock/dcc72f15799c08d130e5 所有节点都非常相似。 FWIW 在过去的几个月里,我已经替换/重新传输了许多节点。 【参考方案1】:

在 DSE 工作人员的帮助下 - 以下设置帮助了我们。

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

将堆新大小增加到 512M * num CPU(在我们的例子中是 4G) 设置 memtable_flush_writers = 8 设置 concurrent_compactors = 总 CPU / 2(在我们的例子中为 4)

进行这些更改后,ParNew GC 时间在引导程序上不再超过 1 秒(以前我们看到 50-100 SECOND GC 时间)。 FWIW 我们在正常操作期间看不到任何 ParNew GC 时间 - 只有引导程序。

【讨论】:

以上是关于Cassandra:将新节点引导到集群时,Long Par New GC 暂停的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 2.1.2 节点卡在加入集群

Cassandra集群管理-替换异常节点

如何加快 cassandra 集群中的节点加入过程

实战-Cassandra之单令牌替换down节点

Cassandra 集群管理-添加新节点

将节点添加到 Cassandra 集群