【发布时间】:2014-02-07 18:47:45
【问题描述】:
我们有一个 Solr 服务器 (Solr 4.5),它为正在开发的项目设置了自定义架构和配置。现在我观察到,通过运行我们的集成测试,Solr 服务器的内存使用量不断增长。这些测试(JUnit)每个都将一组 100 条随机生成的记录发布到服务器,查询一下并删除它们。 删除策略设置为
<deletionPolicy class="solr.SolrDeletionPolicy">
<str name="maxCommitsToKeep">1</str>
<str name="maxOptimizedCommitsToKeep">0</str>
</deletionPolicy>
即使索引不再包含文档,也不会释放内存。每次运行测试都会增加一定数量的已用内存(大约 40 M,而索引本身大约是 7 k),直到整个服务器因 OutOfMemoryError 而死。
Solr 安装在 Tomcat 6.0.35.0 上运行,Java 1.7.0_17 和 -Xmx12g。操作系统是 Linux。
怎么可能?我在哪里可以调整 Solr 的内存处理?
【问题讨论】:
-
您是否在 OOM 之前的日志中看到任何其他问题,例如甲板上的热搜索过多?您对 solrconfig 中不同缓存类型和缓存大小的预热计数是多少?这些会影响 solr 的 RAM 消耗。
-
不,日志中只有一个警告(PERFORMANCE WARNING: Overlapping onDeckSearchers=2),没有错误,也没有我识别的其他提示。
-
此警告意味着,您的提交将快速连续进行。每次提交都会触发搜索器预热。但是,如果您有多个搜索者在热身,其中一些人会白白浪费资源(CPU 和 RAM)。这里的常见补救措施是将预热计数设置为 0(主节点)或增加提交之间的延迟。
-
好吧,当我禁用预热(通过将 usesColdSearcher 设置为 true 并从侦听器事件中删除预热查询。maxWarmingSearchers 设置为 2 时,内存增长仍然会发生。
-
JVM 的 -Xmx 参数值是多少?你的容器是什么?