Datastax solr:Cassandra现在将刷新两个最大的memtables以释放内存

时间:2013-10-14 16:32:59

标签: java solr cassandra datastax-enterprise datastax

我正在使用4Go RAM的单个节点上使用datastax 3.1。 我没有更改cassandra-en.sh和cassandra.yaml中的任何内容,除了“--Xss”(因为我的java版本需要更多) 所以默认情况下Cassandra设置为1Go my -Xms和-Xmx参数:-Xms1024M -Xmx1024M

但是在大​​约200 000行(在3个不同的column_families中)之后插入我的数据时,Solr和cassandra日志会不断重复这种警告:

  

WARN StorageService Flushing CFS(Keyspace ='OpsCenter',   ColumnFamily ='rollups60')以缓解记忆压力17:58:07

     

WARN GCInspector Heap为0.8825103486201678已满。你可能需要减少   memtable和/或缓存大小。卡桑德拉现在将冲到两者   释放内存的最大记忆。调整flush_largest_memtables_at   cassandra.yaml中的阈值,如果你不想让Cassandra这样做的话   自动

所以,好吧我的堆已经满了,但为什么在冲洗之后,我的堆还满了?

如果我此时停止插入数据。警告不断重复。 如果我停止并重新启动cassandra。没问题提出

看起来内存泄漏问题对吗? 那么我应该在哪里看看?

感谢您的未来帮助。

2 个答案:

答案 0 :(得分:1)

Cassandra正在尝试清理堆空间,但是刷新memtables并不会刷新Solr堆数据结构。

对于您拥有的索引大小,加上可能加载Lucene字段缓存的查询,没有分配足够的堆空间。最好的建议是分配更多的堆空间。

查看字段缓存内存使用情况:

http://www.datastax.com/docs/datastax_enterprise3.1/solutions/dse_search_core_status

答案 1 :(得分:1)

记忆力的一件事是Solr的缓存。查看每个Solr内核的“conf”目录中的solrconfig.xml文件,并查看为缓存配置的值,例如:

<filterCache class="solr.FastLRUCache"
             size="100"
             initialSize="0"
             autowarmCount="0"/>

可能有多个像这样的条目。确保至少将autowarmCount和initialSize设置为0.此外,将“size”值降低到较小的值,例如100或者其他值。所有这些值都是指缓存中的条目数。

另一件可能有用的事情是配置Solr更频繁地进行硬提交。寻找一个条目,如:

 <!-- stuff ommited for brevity -->

 <autoCommit> 
   <maxDocs>5000</maxDocs> 
       <maxTime>15000</maxTime> 
       <openSearcher>false</openSearcher> 
 </autoCommit>

以上设置将在每次添加5000个文档或自上次提交后已经过去15秒时提交到磁盘。同时将openSearcher设置为false。

最后,查找这些条目并按如下所示进行设置:

<ramBufferSizeMB>16</ramBufferSizeMB>
<maxBufferedDocs>5000</maxBufferedDocs>

现在,立即对Solr进行所有这些修改肯定会让它运行得慢很多。尝试改为使它们逐渐增加,直到你摆脱内存错误。此外,您可能只需要为Java进程分配更多内存。如果你说机器有4 Gb的RAM,为什么不尝试使用-Xmx2g或-Xmx3g进行测试?