CMS使新世代变空后的Cassandra OOM

时间:2018-10-10 02:11:06

标签: java cassandra

我的cassandra集群有6个节点,但是直到现在,其中的5个节点都因OOM导致的映射失败。
在此之前,CMS会抛出WARN日志,而新一代将完全变空。这不是典型的CMS行为,但我不知道发生了什么。

  

WARN [服务线程] 2018-10-03 23:47:34,510 GCInspector.java:282-ConcurrentMarkSweep GC在4748毫秒内。 CMS旧纪元:4311229160-> 1434360152;伊甸园空间:215565624-> 0;幸存者空间:6320160-> 0

我使用Cassandra 3.9,并且Java堆大小为8GB。我不修改任何jvm选项。
接下来我应该如何检查?

这是system.log的总结。

WARN  [Service Thread] 2018-09-22 16:56:28,089 GCInspector.java:282 - ConcurrentMarkSweep GC in 3926ms.  CMS Old Gen: 1768828144 -> 1173494472; Par Eden Space: 68469544 -> 0; Par Survivor Space: 9587608 -> 0    
ERROR [CompactionExecutor:89253] 2018-09-22 16:56:28,311  CassandraDaemon.java:226 - Exception in thread Thread[CompactionExecutor:89253,1,main]    
org.apache.cassandra.io.FSReadError: java.io.IOException: Map failed
Caused by: java.io.IOException: Map failed
Caused by: java.lang.OutOfMemoryError: Map failed
WARN  [GossipTasks:1] 2018-09-22 16:56:38,185 FailureDetector.java:287 - Not marking nodes down due to local pause of 9094437652 > 5000000000
INFO  [CompactionExecutor:89253] 2018-09-22 16:56:38,190 HeapUtils.java:136 - Dumping heap to /cassandra/java_1521034957.hprof ...
Heap dump file created

ERROR [CompactionExecutor:89253] 2018-09-22 16:56:43,305 JVMStabilityInspector.java:141 - JVM state determined to be unstable.  Exiting forcefully due to:
java.lang.OutOfMemoryError: Map failed

2 个答案:

答案 0 :(得分:0)

强烈建议Cassandra使用G1GC而不是CMS。

为了将G1设置为Java垃圾收集器

  • 打开jvm.options。
  • 注释掉-Xmn800M行。
  • 在“ ### CMS设置”部分中注释所有行。
  • 取消注释
  • 中的相关G1设置
  

G1设置部分:使用Hotspot垃圾优先收集器。   -XX:+ UseG1GC

     

在STW期间让JVM减少记住的设置工作   倾向于并发GC。减少p99.9延迟。   -XX:G1RSetUpdatingPauseTimePercent = 5

Reference设置G1GC

答案 1 :(得分:0)

这看起来像您的系统正在抛出OutOfMemory异常(包括启动堆转储)。默认情况下,堆外直接字节缓冲区将分配最大的堆大小-因此又分配了8gb。如果您的节点没有超过16gb的空间,则可能会达到极限。您的直接字节缓冲区也可能超出了可以使用-XX:MaxDirectMemorySize=12G增加的缓冲区(如果您的缓冲区超过16gb)。确保使用vm.max_map_count = 1000000中的/etc/sysctl.conf和nproc到32768 memlock unlimited等配置内核设置。Datastax在here上也提供了与Cassandra相关的很好的建议。 / p>