2013-12-19 38 views
1

我正在解決Cassandra服務器崩潰的問題。根據Cassandra日誌[1],問題可能是Apache cassandra中的OutOfMemory。我想我們必須調整Cassandra參數來解決這個問題。有沒有其他方法可以解決這個問題?如何調整Cassandra參數以獲得最佳內存使用率?如何解決Apache Cassandra的OutOfMemory問題

  1. 日誌

    INFO 16:32:17353個QpidKeySpace.NodeQueues 0,0 WARN 16:32:17353堆是0.9997729675985393已滿。您可能需要減少memtable和/或緩存大小。卡桑德拉現在將衝上兩個最大的記憶來釋放記憶。如果您不希望Cassandra自動執行此操作,請調整cassandra.yaml中的flush_largest_memtables_at閾值 警告16:32:17,353沖洗CFS(Keyspace ='QpidKeySpace',ColumnFamily ='MessageCountDetails')以緩解內存壓力 信息16:32: 17,761 MessagingService關閉服務器線程。 錯誤16:38:08,647線程中的異常Thread [ReadStage:186,5,main] java.lang.OutOfMemoryError:Java堆空間 at java.nio.ByteBuffer.wrap(ByteBuffer.java:350) at java。 nio.ByteBuffer.wrap(ByteBuffer.java:373) at org.apache.cassandra.io.util.RandomAccessReader.readBytes(RandomAccessReader.java:391) at 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) 的組織。 apache.cassandra.db.OnDiskAtom $ Serializer.deserializeFromSSTable(OnDiskAtom.java:73) at org.apache.c assandra.db.columniterator.IndexedSliceReader $ IndexedBlockFetcher.getNextBlock(IndexedSliceReader.java:370) at org.apache.cassandra.db.columniterator.IndexedSliceReader $ IndexedBlockFetcher.fetchMoreData(IndexedSliceReader.java:325) at org.apache.cassandra。 db.columniterator.IndexedSliceReader.computeNext(IndexedSliceReader.java:151) at 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) at org.apache.cassandra.db.filter.QueryFilter $ 2.hasNext(QueryFilter.java:154) at 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) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at org.apache.cassandra.db.filter.SliceQueryFilter。 collectReducedColumns(SliceQueryFilter.java:157) at org.apache.cassandra.db.filter.QueryFilter.collat​​eColumns(QueryFilter.java:136) at org.apache.cassandra.db.filter.QueryFilter.collat​​eOnDiskAtom(QueryFilter.java:84) at org.apache.cassandra.db.Collat​​ionController.collectAllData(Collat​​ionController.java:293) at org.apache.cassandra。 db.Collat​​ionController.getTopLevelColumns(Collat​​ionController.java:65) at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1357) at 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)

+1

你有沒有試過用'-Xms512m -Xmx512m'這樣的東西增加內存? – Pieter

+0

你有多少ram,你使用的是多大的堆? – psanford

回答

1

第一步在調優過程中將採取堆轉儲並使用eclipse Memory Analyzer或您選擇的其他工具進行分析。

你沒有提到你正在使用的cassandra版本。該版本將確定調整過程的某些方面,因爲新版本的cassandra已將某些內容從堆中移除。

如果您還沒有最喜歡的JMX客戶端,可以從http://code.google.com/p/jmxsh/下載jmxsh。將jar複製到你想要進行堆轉儲的節點。

要使用jmxsh採取堆轉儲,請輸入以下命令:

回聲 'jmx_invoke -m com.sun.management:type=HotSpotDiagnostic dumpHeap /path/to/heapdump.hprof假' | java -jar jmxsh-R5.jar -h localhost -p 7199

+0

我也認爲我可以通過調整Cassandra GC參數來解決這個問題。我正在努力,並儘快發佈結果。感謝您寶貴的答覆 – Malintha