【发布时间】:2012-04-12 20:08:29
【问题描述】:
我正在尝试插入具有大列值 (1-25Mb) 的数据,几秒钟后,我的一个节点因抛出 OOM 或陷入无休止的 GC 循环而死亡。
它通常会尝试刷新 CF,但随后会显示 由于没有脏列族,因此无法减少堆使用量。
由于日志建议我减少内存表/缓存大小,我试图找出是什么耗尽了所有这些内存以调整我的设置,所以我运行了nodetool flush / invalidaterowcache / invalidatekeycache,然后通过 jconsole 触发了 GC。
不幸的是,即使服务器处于空闲状态,我的内存使用率仍然很高 (>60%)。
所以,我的问题是为什么插入大值时服务器内存不足?还有,为什么服务器不回馈一些内存?
编辑
我做了一个heapdump,堆满了byte[],主要是org.apache.cassandra.io.sstable.IndexSummary$KeyPosition的引用。
我不明白这是怎么可能的,因为一切都应该被刷新。
【问题讨论】:
-
你的 JVM 在 Linux 机器上是如何设置的? (堆大小、垃圾收集设置等)另外,您如何配置 Cassandra?您是否在列族上使用二级索引?我要检查的第一个地方是确保您的 linux 机器上有足够大的堆。服务器不会释放内存,因为它要么具有对数据的活动引用(您刚刚放入的所有内容),要么您正在使用不经常收集的天真的停止世界 GC,并且当它停止时一切。