java - 同一分片的所有 Solr 从属内存不足

标签 java tomcat solr

我们使用 Apache Solr 3.5 来驱动我们的网站目录搜索。我们对多个分片使用字段折叠功能,每个分片支持一个只读从属集群。

最近,我们在特定分片的所有从属服务器上遇到内存不足错误。我们在一个特定字段上使用字段折叠,该字段在分片的所有文档上只有一个特定值,其从属内存不足。有趣的是,Out of Memory 错误在一天中多次出现(24 小时内大约出现 4 次),而流量与正常情况没有任何明显偏差。在 16 Gb 机器上分配给每个从属的最大堆大小为 8 Gb。

从那时起我们做了以下工作,现在问题似乎已经解决了 -

  1. 为导致从属组的问题添加了更多水平从属,从 3 个增加到 6 个。
  2. 我们已将复制轮询间隔从 5 分钟增加到 20 分钟。我们发现后台进程 SolrSearchIndexer.warm 正在消耗最大量的堆空间(大约 6 Gb),恰好是在查询开始耗尽内存时。由于复制间隔会导致搜索者变暖,我们考虑增加频率。
  3. 我们已将该组的所有从服务器上分配给 tomcat 的最小堆内存减少到 1Gb。早些时候这是 4Gb。
  4. 3 个问题从站中的一个在未使用的核心上出现 write.lock 异常。从那以后,我们删除了所有从服务器上未使用的核心,因为它是从另一个主 Solr 复制的。未使用的核心有大约 150 万个文档,占用了大约 605 Mb 的磁盘空间。
  5. 我们在所有从站上删除了整个索引并从头开始复制了所有内容。顺便说一下,其中一个从属设备在磁盘上的索引大小异常大 - 2.2 Gb,而其他从属设备上的索引为 1 Gb。

问题分片上索引目录的典型大小约为 1Gb,总共约有 100 万个文档。每个奴隶的平均服务请求约为 10/秒。

我们已经尝试在测试环境中重放当天的全部日志,但不知何故,测试 solr 永远不会用相同的堆设置耗尽内存。坦率地说,我们不确定这种情况不会再次发生。

有人可以建议这里可能是什么问题吗?任何帮助将不胜感激。

谢谢,

图萨尔

最佳答案

我怀疑它涉及缓存定义。您允许多少个搜索者并行驻留(默认为 2 个,但您可以更改)? Searcher warmup其实就是cache warmup,所以如果你有一个working searcher和一个warming searcher,它占用内存大小的两倍。您使用什么缓存(文档/查询/过滤器/字段/自定义)?您是否广泛使用构面(它们在内部使用字段缓存)?许多不同的过滤器查询(FQ)(同样,缓存位图)? 我认为字段折叠也使用字段缓存。

关于java - 同一分片的所有 Solr 从属内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938287/

相关文章:

authentication - 使用 Tomcat 实现自定义身份验证

tomcat - 如何用jasper的jsp引擎,将JSP编译成servlet?

json - 如何使用 Solr 索引哈希数组

solr - 使用apache solr进行同义词搜索

java - 在环境变量中添加了JAVA_HOME,但tomcat说看不到它

java - 如何修复名称排序器? NoSuchElementFound 错误...?

java - Jackson 在尝试映射没有类元素的 JSON 时崩溃

java - NetBeans 中的编译错误

Tomcat 无法启动 : java.net.BindException: 无法分配请求的地址

php - 如何在 php 中制作 Solr 多个 dataimporthandler 调度程序