我的任务是处理Solr安装中的OutOfMemoryError问题。我终于通过使用AggressiveHeap JVM选项让它保持了几分钟。
我从未与Solr合作过,所以感觉我的方式。
这是我们采取的步骤:
启动delta-import后,堆消耗不可避免地增加。我们尝试将Xmx设置为4 Gigs导致OutOfMemoryErrors或系统无响应,因此尝试了AggressiveHeap选项,这导致JVM占用大约5.5 Gigs的RAM。正如你在屏幕上看到的那样,这次GC能够释放内存,内存消耗变得不那么快,然后在图像的右边有另一个GC实际工作,它会继续这样。
这个内存的初始分配是什么?是否将索引加载到RAM中?有没有办法减少这个?
我尝试调整ramBufferSizeMB,maxBufferedDocs,mergeFactor并且还取消注释了StandardIndexReaderFactory的声明,让我将termIndexDivisor设置为12,但是很难看出这些更改是否有所改变(是的:更多分析是必要的。)
索引已在多个失败的索引会话中创建 - 添加termIndexDivisor参数更新 - 索引文件是否已存在这一事实是否会阻止此参数产生任何影响?
(该机器是物理的,有12个ram和16个核心。它与另一个大型Tomcat实例共享机器。我们正在运行Oracle JDK 1.6 21)
答案 0 :(得分:2)
有各种各样的事情。有一件事是mergeFactor
,因为它控制了生成的段数,每个段都有一个段读取器。但是,更改此选项不会导致立即更改内存使用情况。其他选项主要控制索引进程的RAM使用情况,而不是启动时或搜索期间的RAM使用情况。
第二件事是搜索者变暖。通常,在启动期间会有一些查询运行给热门搜索者,并且会执行那些执行的查询。还有控制缓存大小的选项。另见:http://wiki.apache.org/solr/SolrCaching
如果遇到内存问题,将termIndexDivisor设置为12显然不是一件好事。据我所知,在4.x中,术语索引除数是256或128,并且至少在1.x中它被设置为32.此选项控制将术语的条目加载到RAM的数量。在你的情况下每隔12个学期。 即使索引已经存在,termIndexDivisor也应该有效。
如果您的索引加载到RAM由direcotryfactory配置选项控制。
如果您使用Solr主干,可能是您错过了StandardDirectoryFactory在某些情况下解决的更改到MMAPDirectory,这会导致RAM使用率过高(如果您有大量索引)。这种变化发生在今年4月到现在的某个时间。我甚至不确定这是如何通过代码审查实现的,但实际上这是干线的当前状态。
答案 1 :(得分:0)
我最后用调试器进行了一些挖掘,因为即使使用@ fyr的建议,内存消耗并没有真正减少太多。
事实证明,deltaQuery和deltaImportQuery都是查询的副本。这意味着,不是仅返回自上次导入以来已更改的条目的PK,而是查询返回每一行,Solr尝试将它们存储在内存中。 :(