我正在解决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.collateColumns(QueryFilter.java:136)
在org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom(QueryFilter.java:84)
在org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:293)
在org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.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/