solr - Solr、OutOfMemoryErrors 和堆未释放
问题描述
我有一个由三个 Solr 实例(9Gb 堆)组成的 SolrCloud,每个实例由一个专用主机(12Gb RAM)托管。
目前,我们有一个包含 150+ 百万个文档的集合,并且还在不断增长。有时我们会做很多查询,我在 JVM 中看到(我认为是)一种奇怪的行为:
在高原上,所有实例都OutOfMemoryErrors
出现了,当我观察到堆增加时的 GC 时间时,我发现我认为几乎没有 GC:
我已将所有实例配置为使用 GC1,并遵循有关配置良好 Solr 实例的堆的文档,但我觉得这里确实有问题。
有人可以帮助我理解为什么在进行查询时似乎没有发生 GC(可能是一些缓存调整或内存泄漏)?
提前致谢 :)
解决方案
好吧,以防万一其他人遇到这个问题,我的特定用途确实需要一些缓存调整。
TL;博士:
filterCache
在我的收藏中进行调整就可以了!:D
我是如何解决的:
- 通过监控问题发生的时间段确定(感谢 Prometheus 和 Grafana!)
- 确定当时应用程序在做什么
- 试图重现托管条件下的行为
- 一旦我能够随时触发问题,随着堆的增加,我每三分钟对 Solr JVM 进行一次堆转储
- 使用 VisualVM,我分析了 GC 没有清理哪些对象
- 所以我在引用对象中搜索了上一项的列表
所有这些都是为了找出 FastLRUCache 对象包含int[]
数组。谷歌搜索“solr heap growth FastLRUCache”我发现了这个。
所以,现在我们在这个集合中有 2.5 亿个文档,我所要做的就是将filterCache
设置从它的原始512
值调整到一个低得多的数字20
左右。
希望这对将来的其他人有所帮助。
推荐阅读
- c - 非指针数组中的哨兵
- docker - 将文件添加到`/docker-entrypoint.d/` 作为 app.conf.template 文件的一部分,以将全局变量交换到 nginx 设置中
- php - 如何从 mysql php 查询结果中只获取一个值
- reactjs - 本地 GET 请求不同于 Heroku 部署的请求
- python - 使用 python 读取 CSV 以存储在 GCP 大查询中
- laravel - [Laravel]计算表列具体范围问题
- python - 如何沿对角线替换 PyTorch 张量中的特定值?
- java - 如何在 Laravel 5 中读取 Redis 数据
- solr - Solr 8.7 configset 在使用身份验证上传时为空
- c++ - c ++更改另一个类中的对象值