启动期间的Solr内存消耗-加载索引?

启动期间的Solr内存消耗-加载索引?,solr,jvm,Solr,Jvm,我的任务是处理Solr安装中的OutOfMemoryError问题。通过使用AggressiveHeap JVM选项,我终于设法让它保持了几分钟以上 我从来没有和Solr一起工作过,所以我有一点感觉 这是我们采取步骤的过程: 启动雄猫 启动增量导入 增量导入启动后,堆消耗将不可避免地增加。我们尝试将Xmx设置为4 Gig,这会导致OutOfMemoryErrors或系统无响应,因此尝试了AggressiveHeap选项,这会导致JVM占用大约5.5 Gig的RAM。正如你在屏幕上看到的,这一次G

我的任务是处理Solr安装中的OutOfMemoryError问题。通过使用AggressiveHeap JVM选项,我终于设法让它保持了几分钟以上

我从来没有和Solr一起工作过,所以我有一点感觉

这是我们采取步骤的过程:

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

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

    我尝试过调整ramBufferSizeMB、maxBufferedDocs、mergeFactor,还取消了StandardIndexReaderFactory声明的注释,让我将termIndexDivisor设置为12,但很难看出这些更改是否有任何不同(是的:需要更多分析)

    索引是在许多失败的索引会话上创建的-termIndexDivisor参数的添加是最近的-索引文件已经存在的事实是否会阻止此参数产生任何影响


    (这台机器是物理的,有12 Gig的ram和16个内核。它与另一个大型Tomcat实例共享这台机器。我们正在运行Oracle JDK 1.6 21)

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

    第二件事是搜索者变暖。通常,在启动过程中会有一些查询运行到热搜索程序,这些查询会被缓存。还有一些控制缓存大小的选项。另见:

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

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


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

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

    事实证明,deltaQuery和deltaImportQuery都是该查询的副本。这意味着查询不是只返回自上次导入以来更改的条目的PKs,而是返回每一行,Solr试图将它们存储在内存中(