首页 > 解决方案 > Solr、OutOfMemoryErrors 和堆未释放

问题描述

我有一个由三个 Solr 实例(9Gb 堆)组成的 SolrCloud,每个实例由一个专用主​​机(12Gb RAM)托管。

目前,我们有一个包含 150+ 百万个文档的集合,并且还在不断增长。有时我们会做很多查询,我在 JVM 中看到(我认为是)一种奇怪的行为:

Solr 堆增长

在高原上,所有实例都OutOfMemoryErrors出现了,当我观察到堆增加时的 GC 时间时,我发现我认为几乎没有 GC:

Solr JC时代

我已将所有实例配置为使用 GC1,并遵循有关配置良好 Solr 实例的堆的文档,但我觉得这里确实有问题。

有人可以帮助我理解为什么在进行查询时似乎没有发生 GC(可能是一些缓存调整或内存泄漏)?

提前致谢 :)

标签: solrheap-memory

解决方案


好吧,以防万一其他人遇到这个问题,我的特定用途确实需要一些缓存调整。

TL;博士:

filterCache在我的收藏中进行调整就可以了!:D


我是如何解决的:

  1. 通过监控问题发生的时间段确定(感谢 Prometheus 和 Grafana!)
  2. 确定当时应用程序在做什么
  3. 试图重现托管条件下的行为
  4. 一旦我能够随时触发问题,随着堆的增加,我每三分钟对 Solr JVM 进行一次堆转储
  5. 使用 VisualVM,我分析了 GC 没有清理哪些对象
  6. 所以我在引用对象中搜索了上一项的列表

所有这些都是为了找出 FastLRUCache 对象包含int[]数组。谷歌搜索“solr heap growth FastLRUCache”我发现了这个

所以,现在我们在这个集合中有 2.5 亿个文档,我所要做的就是将filterCache设置从它的原始512值调整到一个低得多的数字20左右。

希望这对将来的其他人有所帮助。


推荐阅读