0

我正在使用 4Go RAM 的单个节点上使用 datastax 3.1。我没有更改 cassandra-en.sh 和 cassandra.yaml 中的任何内容,除了“--Xss”(因为我的 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 现在将刷新到两个最大的内存表以释放内存。如果您不希望 Cassandra 自动执行此操作,请调整 cassandra.yaml 中的 flush_largest_memtables_at 阈值

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

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

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

感谢您的未来帮助。

4

2 回答 2

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 进行测试?

于 2013-10-17T14:15:22.890 回答
1

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

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

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

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

于 2013-10-14T17:31:28.817 回答