Solr云4.8.1和Lucene中的内存泄漏

时间:2015-04-08 21:23:03

标签: java solr lucene solrcloud

我有一个solr云实例版本4.8.1,包含8个节点,4个分片和JVM上面临的内存泄漏

以下是该实例的详细信息。

  1. 8个节点,4个分片(每个分片2个节点)
  2. 每个节点拥有大约55 GB的数据,集合中总共有4.5亿个文档。所以文档大小不是很大,
  3. 架构有42个字段,每15分钟重新加载一次,约有50,000个文档。现在我们有索引的主键,所以当有任何重复时,文档会被重写。
  4. GC策略是CMS,堆大小为min和max = 8 gb,perm size = 512 mb,VM上的RAM为24 gb。
  5. 当用户开始在solr中搜索(大约50个并发用户)并且并非总是如此但堆通常不断增长并且GC周期没有清理堆。我看到GC运行了将近100,000毫秒仍然没有清理堆。肯定会发生内存泄漏。

    看看当JVM堆大小达到99.9%时所采取的堆转储,我看到org.apache.lucene.search.FieldCacheImpl占用了大量内存7.13 GB(7.5 GB堆中),它有一个浅的大小只有32字节,但引用了很多HashMap和WeakHashMap对象,看起来像是一个单例,但找不到它为什么这样做的原因。 在此发布以查明是否有人因为大量数据的solr云而面临内存泄漏,以及是否可以通过配置更改进行修复。

1 个答案:

答案 0 :(得分:0)

事实证明,lucene字段缓存将用于排序和分面操作,如果排序是强制用例,那么解决方案是定义具有docValue(如下所示)属性的字段,用于排序数据。

<field name="test_field" type="string" indexed="false" stored="false" docValues="true" />

文本字段和标记化器不支持docValues,因此在这种情况下,我定义了一个类型为solr.StrField的新字段,并将其用于排序操作。

这消除了高速缓存和Java堆内存的使用,而不必牺牲任何功能。