【问题标题】:Getting OutOfMemory in Cassandra Java Heap Space version 1.0.7 frequently on different nodes在不同节点上频繁出现 Cassandra Java Heap Space 1.0.7 版中的 OutOfMemory
【发布时间】:2013-04-21 00:58:41
【问题描述】:

我正在运行 Cassandra 1.0.7,5 个节点,每个节点有 8GB 物理 RAM,我的堆是 4GB。 我经常开始遇到这样的节点故障:

 WARN [ScheduledTasks:1] 2013-04-10 10:18:12,042 GCInspector.java (line 145) Heap is 0.9602098156121341 full.  You may need to reduce memtable and/or cache sizes.  Cassandra will now flush up to the two largest memtables to free up memory.  Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically


 WARN [ScheduledTasks:1] 2013-04-10 10:18:12,042 StorageService.java (line 2645) Flushing CFS(Keyspace='Company', ColumnFamily='01_Meta') to relieve memory pressure

 WARN [ScheduledTasks:1] 2013-04-10 10:18:14,403 GCInspector.java (line 145) Heap is 0.9610030442856479 full.  You may need to reduce memtable and/or cache sizes.  Cassandra will now flush up to the two largest memtables to free up memory.  Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically

 WARN [ScheduledTasks:1] 2013-04-10 10:18:14,403 StorageService.java (line 2645) Flushing CFS(Keyspace='Company', ColumnFamily='01_Meta') to relieve memory pressure

ERROR [MutationStage:23969] 2013-04-10 10:18:18,339 AbstractCassandraDaemon.java (line 139) Fatal exception in thread Thread[MutationStage:23969,5,main]
java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:39)
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:312)
    at org.apache.cassandra.utils.SlabAllocator.allocate(SlabAllocator.java:68)
    at org.apache.cassandra.utils.Allocator.clone(Allocator.java:32)
    at org.apache.cassandra.db.Column.localCopy(Column.java:244)
    at org.apache.cassandra.db.Memtable.resolve(Memtable.java:215)
    at org.apache.cassandra.db.Memtable.put(Memtable.java:143)
    at org.apache.cassandra.db.ColumnFamilyStore.apply(ColumnFamilyStore.java:805)
    at org.apache.cassandra.db.Table.apply(Table.java:431)
    at org.apache.cassandra.db.RowMutation.apply(RowMutation.java:256)
    at org.apache.cassandra.service.StorageProxy$6.runMayThrow(StorageProxy.java:416)
    at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1223)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

启动参数为:

/usr/lib/jvm/jdk1.6.0_31/bin/java
-ea
-javaagent:/usr/share/cassandra//lib/jamm-0.2.5.jar
-XX:+UseThreadPriorities
-XX:ThreadPriorityPolicy=42
-Xms4G
-Xmx4G   heap size
-Xmn200M
-XX:+HeapDumpOnOutOfMemoryError
-Xss128k
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.net.preferIPv4Stack=true
-Dcom.sun.management.jmxremote.port=7199
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dlog4j.configuration=log4j-server.properties
-Dlog4j.defaultInitOverride=true
-Dcassandra-pidfile=/var/run/cassandra/cassandra.pid
-cp /etc/cassandra/conf:/usr/share/cassandra/lib/antlr-

关于从哪里开始有什么想法吗?我在看这里: http://www.datastax.com/docs/1.0/operations/tuning#tuning-options-for-size-tiered-compaction http://www.datastax.com/docs/1.0/operations/tuning#tuning-java-heap-size

但到目前为止,似乎没有什么不寻常的。任何建议都非常感谢。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 在 8GB 机器上的 4GB 堆似乎相当高,您正在从内核缓存中取出 RAM 并增加 GC 的暂停时间。我希望堆更像 2GB。

    确实,如果您偏离了 cassandra-env.sh 中的任何 JVM 设置,并且您没有 100% 准确理解所做更改的含义,那么您已经陷入了麻烦之中。如果您在没有将所有内容从 JVM 和 Cassandra 中绘制出来的情况下执行此操作,那么您将获得更多。

    不仅如此,如果没有大量信息,几乎不可能诊断内存问题,因此您需要非常仔细地查看数据访问模式。试着回答这个问题:

    • 读取/秒与写入/秒?
    • 每次读取返回多少数据?
    • 每次写入写入多少数据?
    • 您的写入是否经常覆盖相同的行键和/或列 名字?
    • 如果他们这样做了,您应该知道这将显着 压实压力,如果你的流量没有改变,但你 随着时间的推移越来越频繁地看到OOM这是一个 检查确定。你的行有多宽?

    查看 nodetool cfstats 是否有任何不寻常的地方,例如您认为很窄的非常宽的行或占用比您预期更多的空间的行。

    您确实应该拥有可以从 Cassandra 和 JVM 中提取的每个指标的图表。为此,我使用 jmxtrans 和石墨,这些是我的 cassandra 集群中的核心工具,我从中获得的洞察力和随之而来的数据重构使我从一个几乎每天中断的 12 节点集群到过去没有停机的 3 节点集群年(并且流量翻倍),所以我不能强调这一点,您需要对生产集群进行适当的趋势分析,以正确理解、管理和优化您的数据访问。

    【讨论】:

    • 你所说的“宽行”是什么意思,Cassandra 不是在一行中的每列上加载数据吗?而不是整行?还是一次加载整个列键集?我认为这已通过二分搜索等进行了全面优化。我特别感兴趣,因为我大量使用列来对项目进行排序,而且我很可能有一行包含 100 万列用作索引。
    • 我没有使用过最新版本的 Cassandra,但如果我没记错的话,整行中的压缩都会读取。阅读文档,因为我不记得我使用的是哪种压缩方法,我怀疑 leveled 可能会缓解这个问题(或者我可能记错了整个事情)。在正常操作期间,如果您是正确的,它将读取连续列的块而不是整行(当然,除非您告诉它)。
    • 啊!我正在此页面上阅读wiki.apache.org/cassandra/StorageConfiguration,您确实可以创建一个 row_cache,在这种情况下,整行都会被加载。但是,默认值现在是 0(没有基于行的缓存。)所以我很好!话虽如此,这表明我可以将一张表一分为二,因为一张表可以从行缓存中受益......
    猜你喜欢
    • 2021-01-12
    • 2013-12-20
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多