同一碎片的所有Solr从站的内存不足

时间:2013-07-30 04:24:47

标签: 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. 我们已将此组的所有从属服务器上的最小堆分配减少到1Gb。早些时候这是4Gb。
  4. 3个问题从属中的一个是在未使用的核心上有write.lock异常。从那时起,我们已经删除了所有从站上未使用的核心,因为它是从另一个主Solr复制的。未使用的核心有大约150万个文档,在磁盘上消耗大约605 Mb。
  5. 我们删除了所有从属服务器上的整个索引,并从头开始复制所有内容。顺便说一句,其中一个奴隶在磁盘上有一个异常大的索引--2.2 Gb,而其他奴隶则为1 Gb。
  6. 问题分片上索引目录的典型大小约为1Gb,总共大约有100万个文档。每个奴隶的平均请求量大约为10 /秒。

    我们已经尝试在测试环境中重播当天的整个日志,但不知何故,测试solr永远不会因为相同的堆设置而耗尽内存。坦率地说,我们不确定这不会再发生。

    有人可以在这里提出可能存在的问题吗?任何帮助将不胜感激。

    谢谢,

    Tushar

2 个答案:

答案 0 :(得分:0)

我怀疑它涉及到缓存定义。您允许并行驻留的搜索者数量(默认为2但您可以更改)?搜索者热身实际上是一个缓存预热,所以如果你有一个工作的搜索者和一个温暖的搜索者,它占用两倍的内存大小。你使用什么缓存(文档/查询/过滤器/字段/自定义)?你是否广泛使用facet(他们在内部使用字段缓存)?许多不同的过滤查询(FQ)(再次,缓存位图)? 我认为字段折叠也使用字段缓存。

答案 1 :(得分:0)

自从发生这种情况以来它很安静,但我认为在这里分享原因是值得的。我们的网站被在查询中使用非常大的开始参数的人刮掉了。 Solr分布式索引对起始参数的大小有限制(超过500000)。当发生大量复制并且协调分片因为启动参数较高而已经从贡献节点传入大量内存中的文档时,就会发生内存不足。

详情可在此处找到 - https://wiki.apache.org/solr/DistributedSearch#Distributed_Searching_Limitations

我们的解决方案是将start参数设置为大约1000,因为人类很少超出列表的前几页。