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

问题描述:

我正在使用4Go内存的单个节点上使用datastax 3.1。 我没有改变cassandra-en.sh和cassandra.yaml中的任何东西,除了“--Xss”(因为我的java版本需要更多一点) 所以默认情况下Cassandra设置为1Go my -Xms和-Xmx参数:-Xms1024m -Xmx1024MDatastax solr:Cassandra现在将刷新两个最大的memtables以释放内存

但同时插入我的数据大约200 000行之后(在3个不同column_families),Solr的和卡桑德拉日志保留重复这种警告:

WARN StorageService法拉盛CFS(KEYSPACE = 'OpsCenter', ColumnFamily ='rollups60')来缓解内存压力17:58:07

警告GCInspector堆是0.8825103486201678满。您可能需要减少 可记录和/或缓存大小。卡桑德拉现在将刷新两个最大的存储空间以释放内存。调整flush_largest_memtables_at在cassandra.yaml 门槛,如果你不想卡桑德拉自动做到这一点

所以,我的OK堆是满的,但为什么每次冲洗后,我仍堆满了吗?

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

它看起来像内存泄漏问题吧? 那么我应该在哪里看?

感谢您的未来帮助。

一两件事,这是一个内存猪是Solr的缓存。看看每个Solr的核心的“CONF”目录内的文件solrconfig.xml中,并期待在配置缓存,如值:像这样的

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

可能有多个条目。确保至少将autowarmCount和initialSize设置为0.此外,将“大小”值降低为小数目,例如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进行测试?

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

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

查看域高速缓存内存使用:

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

+0

我很困惑。有没有办法强制Solr在物理内存中交换以避免JVM堆满?我知道,这将是时间成本,但如果不是这样,那意味着对于一个节点,我只能设置大约1G0的索引数据,所以(在我的情况下)大约是2 Go的实际数据...... – hebus