2011-12-14 67 views
1

我的任务是处理Solr安装中的OutOfMemoryError问题。我终于设法通过使用AggressiveHeap JVM选项来保持它超过几分钟。启动过程中的Solr内存消耗 - 加载索引?

我从来没有与Solr合作过,所以我感觉我的方式有点。

这是我们采取措施的过程:

  1. 启动Tomcat
  2. 揭开序幕增量导入

的增量导入启动后,堆消耗不可避免地上升。我们尝试将Xmx设置为4 Gig,这会导致OutOfMemoryErrors或系统无响应,因此尝试了AggressiveHeap选项,这导致JVM占用大约5.5 Gig的RAM。正如你在屏幕上看到的那样,这次GC能够释放内存,内存消耗变得不那么快,然后在图像的右侧有另一个实际上工作的GC,并且它继续像这样。

VisualVM

什么是内存的初始分配?它是索引被加载到RAM中吗?有没有办法减少这种情况?

我已经尝试调整ramBufferSizeMB,maxBufferedDocs,mergeFactor并且还取消了StandardIndexReaderFactory的声明让我设置termIndexDivisor为12,但很难看出这些更改是否有所作为(是的:需要更多分析)。

该索引已创建了多个失败的索引会话 - termIndexDivisor参数的添加更新 - 索引文件已存在的事实是否阻止此参数发挥作用?

(本机是物理的,具有RAM和16个内核的12场演唱会,这是另一个大Tomcat实例共享的机器。我们正在运行的Oracle JDK 1.6 21)

回答

0

我最终用调试器进行了一些挖掘,因为即使使用@ fyr的建议,内存消耗也没有真正降低太多。

原来,deltaQuery和deltaImportQuery都是查询的碳副本。这意味着,不是只返回自上次导入后更改的条目的PK,而是查询每行返回并且Solr试图将它们存储在内存中。 :(

2

有各种各样的事情。有一件事是mergeFactor,因为它控制着生成的段的数量,并且每个段都有一个段阅读器。但是,更改此选项不会立即更改内存使用情况。其他选项主要控制索引进程的RAM使用情况,而不是启动时或搜索期间的RAM使用情况。

第二件事是搜索者变暖。通常会在启动期间运行一些查询以加热搜索者,并且执行的查询将被缓存。还有控制缓存大小的选项。另请参阅:http://wiki.apache.org/solr/SolrCaching

如果遇到内存问题,将termIndexDivisor设置为12显然不是一件好事。据我在4.x中所知,术语索引除数是256或128,至少在1.x中它被设置为32.这个选项控制你的术语有多少条目被加载到RAM中。你的情况每十二届。 即使索引已存在,termIndexDivisor也应具有效果。

如果索引加载到RAM由direcotryfactory配置选项控制。

如果您在Solr主干上工作,您可能错过StandardDirectoryFactory在某些情况下解决的更改为MMAPDirectory,这会导致激烈的RAM使用(如果您的索引较大)。这一变化发生在今年4月至今的某个时候。林甚至不知道这是如何通过代码审查,但这实际上是干线的当前状态。