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

Posted

技术标签:

【中文标题】Datastax solr:Cassandra 现在将刷新到两个最大的内存表以释放内存【英文标题】:Datastax solr: Cassandra will now flush up to the two largest memtables to free up memory 【发布时间】:2013-10-22 07:01:51 【问题描述】:

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

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

WARN StorageService Flushing CFS(Keyspace='OpsCenter',​ ColumnFamily='rollups60') 缓解内存压力 17:58:07

警告 GCInspector 堆已满 0.8825103486201678。你可能需要减少 memtable 和/或缓存大小。 Cassandra 现在会冲到两个 最大的内存表来释放内存。调整flush_largest_memtables_at 如果您不想让 Cassandra 执行此操作,请在 cassandra.yaml 中设置阈值 自动

那么,好吧,我的堆是满的,但是为什么在刷新之后,我的堆还是满的?

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

看起来像是内存泄漏问题,对吧? 那我应该看哪里呢?

感谢您的帮助。

【问题讨论】:

【参考方案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 进行测试?

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

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

以上是关于Datastax solr:Cassandra 现在将刷新到两个最大的内存表以释放内存的主要内容,如果未能解决你的问题,请参考以下文章

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

cassandra datastax 编写生成的代码时出现意外错误:java.lang.NullPointerException

如果结果集较大,则使用 Cassandra 和 DataStax Java 驱动程序时出现 NoHostAvailableException

将单个令牌节点添加到现有的 datastax cassandra 集群和数据传输不起作用

在 Solr Admin 中显示为 0 的 Numdocs

NoSuchMethodException 使用 datastax cassandra 映射器