java – Solr Filter Cache(FastLRUCache)占用太多内存并导致内存不足?

前端之家收集整理的这篇文章主要介绍了java – Solr Filter Cache(FastLRUCache)占用太多内存并导致内存不足?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Solr设置.一个主服务器和两个从服务器用于复制.我们在索引中有大约7000万份文件.从站有16 GB的RAM. OS和HD为10GB,Solr为6GB.

但是,奴隶有时会失去记忆.当我们在内存不足之前下载转储文件时,我们可以看到该类:

org.apache.solr.util.ConcurrentLRUCache$Stats @ 0x6eac8fb88

正在使用高达5Gb的内存.我们广泛使用过滤缓存,它的命中率为93%.这是solrconfig.xml中过滤器缓存的xml

<property name="filterCache.size" value="2000" />
<property name="filterCache.initialSize" value="1000" />
<property name="filterCache.autowarmCount" value="20" />

<filterCache class="solr.FastLRUCache"
             size="${filterCache.size}"
             initialSize="${filterCache.initialSize}"
             autowarmCount="${filterCache.autowarmCount}"/>

查询结果具有相同的设置,但使用LRUCache并且它仅使用大约35mb的内存.是否有需要修复的配置有问题,或者我只需要更多内存用于过滤缓存?

解决方法

在一位朋友告诉我过滤器缓存的工作原理有多大之后,很明显我们为什么会不时出现内存错误.

那么过滤器缓存有什么作用呢?
基本上它创建类似于数组的东西,它告诉哪些文档与过滤器匹配.有些像:

cache = [1,1,.. 0]

1表示命中,0表示没有命中.因此,对于该示例,这意味着过滤器缓存匹配第0和第3个文档.因此,缓存有点像一个位数组,具有总文档的长度.因此,假设我有50万个文档,因此数组长度将为50百万,这意味着一个过滤器缓存将占用内存中的50.000.000位.

所以我们指定我们想要2000过滤器缓存,这意味着它将采取的RAM大致是:

50.000.000 * 2000 = 100.000.000.000 bit

如果你把它转换为Gb.这将是:

100.000.000.000 bit / 8 (to byte) / 1000 (to kb) / 1000 (to mb) / 1000 (to gb) = 12,5 Gb

因此,过滤器缓存所需的总RAM大约为12Gb.这意味着如果Solr只有6Gb堆空间,它将无法创建2000过滤器缓存.

是的,我知道Solr并不总是创建这个数组,如果过滤查询的结果很低,它只能创建一些占用更少内存的东西.这个计算只是粗略地说明过滤器缓存的上限是多少,如果它在ram中有2000个缓存.在其他更好的情况下它可以更低.

因此,一种解决方案是降低solr配置中的最大过滤缓存数量.我们检查了solr统计信息,大多数时候我们只有大约600个过滤器缓存,所以我们可以将过滤器缓存数量减少到最大值.

另一种选择当然是添加更多RAM.

猜你在找的Java相关文章