Java Cassandra 2.1 OutOfMemory

Java Cassandra 2.1 OutOfMemory,java,cassandra,heap,thrift,cassandra-2.1,Java,Cassandra,Heap,Thrift,Cassandra 2.1,我有一个带有64G ram(16GB堆,G1GC)的Cassandra节点,偶尔会发生这种情况: ERROR [Thrift:74] 2017-06-11 13:20:25,710 CassandraDaemon.java:229 - Exception in thread Thread[Thrift:74,5,main] java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.j

我有一个带有64G ram(16GB堆,G1GC)的Cassandra节点,偶尔会发生这种情况:

ERROR [Thrift:74] 2017-06-11 13:20:25,710 CassandraDaemon.java:229 - Exception in thread Thread[Thrift:74,5,main]
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236) ~[na:1.8.0_45]
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) ~[na:1.8.0_45]
        at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) ~[na:1.8.0_45]
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) ~[na:1.8.0_45]
        at org.apache.thrift.transport.TFramedTransport.write(TFramedTransport.java:146) ~[libthrift-0.9.2.jar:0.9.2]
        at org.apache.thrift.protocol.TBinaryProtocol.writeBinary(TBinaryProtocol.java:211) ~[libthrift-0.9.2.jar:0.9.2]
        at org.apache.cassandra.thrift.Column$ColumnStandardScheme.write(Column.java:678) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.Column$ColumnStandardScheme.write(Column.java:611) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.Column.write(Column.java:538) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.ColumnOrSuperColumn$ColumnOrSuperColumnStandardScheme.write(ColumnOrSuperColumn.java:673) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.ColumnOrSuperColumn$ColumnOrSuperColumnStandardScheme.write(ColumnOrSuperColumn.java:607) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.ColumnOrSuperColumn.write(ColumnOrSuperColumn.java:517) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.Cassandra$multiget_slice_result$multiget_slice_resultStandardScheme.write(Cassandra.java:14729) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.Cassandra$multiget_slice_result$multiget_slice_resultStandardScheme.write(Cassandra.java:14633) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.cassandra.thrift.Cassandra$multiget_slice_result.write(Cassandra.java:14563) ~[apache-cassandra-thrift-2.1.13.jar:2.1.13]
        at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:53) ~[libthrift-0.9.2.jar:0.9.2]
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39) ~[libthrift-0.9.2.jar:0.9.2]
        at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:205) ~[apache-cassandra-2.1.13.jar:2.1.13]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_45]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_45]
        at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_45]
现在,增加我的堆似乎是一个明显的信息,但我不愿意在不知道为什么的情况下这样做

它看起来像是在尝试写操作,堆上的空间用完了。以下是节点崩溃时的jconsole视图:

我们正在使用kairsdb,这显示了该节点大约5k次写入/秒(kairsdb.datastore.write\u size)

同时,我将CASSANDRA_HEAPDUMP_DIR设置在允许编写的地方,这样我可以进一步查看

一些配置变量:

  • 密钥缓存大小(单位:mb):256
  • 行缓存大小(单位:mb):0
  • 并发读数:128
  • 并发写入:64
  • 并发计数器写入:64
  • memtable\u分配\u类型:堆外\u对象
  • 并发压缩程序:1
  • 每秒压缩量:48
有什么想法/建议/建议吗

谢谢

编辑: 另一个节点死了,这个堆输出指向JMX??

如果您已经拥有heapdump,请尝试将其加载到eclipse内存分析器工具(MAT)()中。它提供了一个很好的饼图输出,可以帮助可视化内存中的内容。此外,机器中的内核数是多少,并发_写入可以是内核数*8的倍数。memtable\u flush\u writers上的配置值是多少?如果存储由SSD支持,您可能应该增加它。看起来您使用的是一个节俭客户端。您使用的节俭型客户机是什么。并张贴您如何使用thrift客户端创建连接。你在使用批处理语句吗?@dilsingi我今天刚拿到heapdump,看看饼图:
线程java.lang.thread@0x356384718 Thrift:242保存总大小为5988684488(83.16%)字节的局部变量。内存累积在“java.util.HashMap$Node[]”的一个实例中,该实例由“”加载。
该机器有8个内核(16个带HT),memtable_flush_writers当前已注释掉,因此根据注释将设置为2?存储不是由SSD支持的,只有大量的1TB磁盘RAID6@ShobanSundarthrift客户机是Kairosdb1.1.3,我不确定它是否使用批处理语句,但我相信它确实使用了6GB的数据,这可能意味着Kairos有一个巨大的分区。通过Kairos使用了多少百万个指标/标签?尝试在Kairos数据表上的“nodetool cfhistogram”检查C*中的分区大小。我们唯一需要改变的另一个卡桑德拉·亚马尔(Cassandra yaml)是节俭型、框架型、运输型、大小型(我们将其设置为150MB)。检查kairosdb.datastore.cassandra.write_delay和kairosdb.datastore.cassandra.write_buffer_max_size上Kairos集群的值。write_缓冲区控制每次将多少数据推送到Cassandra。尝试降低它以稳定Cassandra端的写吞吐量。