java - 如何解决Apache Cassandra的OutOfMemory问题

标签 java cassandra out-of-memory

我正在解决Cassandra服务器崩溃的问题。根据Cassandra日志[1],问题可能是Apache cassandra中的内存不足。我认为我们必须调整Cassandra参数才能解决此问题。还有其他解决方法吗?如何调整Cassandra参数以最佳使用内存?


日志

信息16:32:17,353 QpidKeySpace.NodeQueues 0,0
 WARN 16:32:17,353堆已满0.9997729675985393。您可能需要减少内存和/或缓存的大小。 Cassandra现在将刷新到两个最大的内存表以释放内存。如果您不希望Cassandra自动执行此操作,请在cassandra.yaml中调整flush_largest_memtables_at阈值
 WARN 16:32:17,353刷新CFS(Keyspace ='QpidKeySpace',ColumnFamily ='MessageCountDetails')以减轻内存压力
 INFO 16:32:17,761 MessagingService关闭服务器线程。
错误16:38:08,647线程Thread [ReadStage:186,5,main]中发生异常
java.lang.OutOfMemoryError:Java堆空间
        在java.nio.ByteBuffer.wrap(ByteBuffer.java:350)
        在java.nio.ByteBuffer.wrap(ByteBuffer.java:373)
        在org.apache.cassandra.io.util.RandomAccessReader.readBytes(RandomAccessReader.java:391)
        在org.apache.cassandra.utils.ByteBufferUtil.read(ByteBufferUtil.java:392)
        在org.apache.cassandra.utils.ByteBufferUtil.readWithShortLength(ByteBufferUtil.java:371)
        在org.apache.cassandra.db.OnDiskAtom $ Serializer.deserializeFromSSTable(OnDiskAtom.java:84)
        在org.apache.cassandra.db.OnDiskAtom $ Serializer.deserializeFromSSTable(OnDiskAtom.java:73)
        在org.apache.cassandra.db.columniterator.IndexedSliceReader $ IndexedBlockFetcher.getNextBlock(IndexedSliceReader.java:370)处
        在org.apache.cassandra.db.columniterator.IndexedSliceReader $ IndexedBlockFetcher.fetchMoreData(IndexedSliceReader.java:325)处
        在org.apache.cassandra.db.columniterator.IndexedSliceReader.computeNext(IndexedSliceReader.java:151)
        在org.apache.cassandra.db.columniterator.IndexedSliceReader.computeNext(IndexedSliceReader.java:48)
        在com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
        在com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
        在org.apache.cassandra.db.columniterator.SSTableSliceIterator.hasNext(SSTableSliceIterator.java:90)
        在org.apache.cassandra.db.filter.QueryFilter $ 2.getNext(QueryFilter.java:171)
        在org.apache.cassandra.db.filter.QueryFilter $ 2.hasNext(QueryFilter.java:154)
        在org.apache.cassandra.utils.MergeIterator $ Candidate.advance(MergeIterator.java:143)
        在org.apache.cassandra.utils.MergeIterator $ ManyToOne.advance(MergeIterator.java:122)
        在org.apache.cassandra.utils.MergeIterator $ ManyToOne.computeNext(MergeIterator.java:96)
        在com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
        在com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
        在org.apache.cassandra.db.filter.SliceQueryFilter.collectReducedColumns(SliceQueryFilter.java:157)
        在org.apache.cassandra.db.filter.QueryFilter.collat​​eColumns(QueryFilter.java:136)
        在org.apache.cassandra.db.filter.QueryFilter.collat​​eOnDiskAtom(QueryFilter.java:84)
        在org.apache.cassandra.db.Collat​​ionController.collectAllData(Collat​​ionController.java:293)
        在org.apache.cassandra.db.Collat​​ionController.getTopLevelColumns(Collat​​ionController.java:65)
        在org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1357)
        在org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1214)
        在org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1126)
        在org.apache.cassandra.db.Table.getRow(Table.java:347)
        在org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:70)
        在org.apache.cassandra.service.StorageProxy $ LocalReadRunnable.runMayThrow(StorageProxy.java:1052)

最佳答案

调整过程的第一步将是进行堆转储,并使用Eclipse Memory Analyzer或您选择的其他工具对其进行分析。

您没有提到您使用的cassandra版本。该版本将确定调整操作过程的某些方面,因为新版本的cassandra已将某些内容从堆中移出。

如果您还没有喜欢的JMX客户端,则可以从http://code.google.com/p/jmxsh/下载jmxsh。将jar复制到要进行堆转储的节点上。

要使用jmxsh进行堆转储,请输入以下命令:

echo'jmx_invoke -m com.sun.management:type=HotSpotDiagnostic dumpHeap /path/to/heapdump.hprof false'| java -jar jmxsh-R5.jar -h本地主机-p 7199

关于java - 如何解决Apache Cassandra的OutOfMemory问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20678288/

相关文章:

c# - 使用 foreach 循环解析大型文本文件的奇怪行为 (C# .NET 4)

android - HEAD 请求上的 Volley 内存泄漏

Java JDBC 登录表单

java - 调试时如何处理 ClassNotLoadedException?

database - 在 Cassandra 中使用计数器进行数据建模,过期列

python - 为什么我的 Spark Streaming 工作变慢了

python - 如何在 python/OpenCV 中执行一系列非常大的图像平均?

java - 让jar文件在mac上的cmd或终端中运行

JAVA接收: use @PathParam and application/x-www-form-urlencoded body in the same method

text - Cassandra WHERE - 比较不区分大小写