0

我们正在使用 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 在相同的堆设置下永远不会出现内存不足。坦率地说,我们不确定这种情况不会再次发生。

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

谢谢,

图沙尔

4

2 回答 2

0

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

于 2013-07-30T18:43:38.630 回答
0

这件事发生后的某个时候很安静,但我认为在这里分享原因是值得的。我们的网站被在查询中使用非常大的起始参数的人抓取了。Solr 分布式索引对起始参数的大小有限制(超过 500000)。当发生大量复制并且协调分片由于高启动参数而在内存中已经有大量文档来自贡献节点时,通常会发生内存不足。

详细信息可以在这里找到 - https://wiki.apache.org/solr/DistributedSearch#Distributed_Searching_Limitations

我们的解决方案是将起始参数的上限设置为 1000 左右,因为人类很少超出列表的前几页。

于 2014-02-22T17:47:35.430 回答