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