Row*_*nto 6 java lucene solr out-of-memory
我有一个Solr设置.一个主服务器和两个从服务器用于复制.我们在索引中有大约7000万份文件.从站有16 GB的RAM.OS和HD为10GB,Solr为6GB.
但是,奴隶有时会失去记忆.当我们在内存不足之前下载转储文件时,我们可以看到该类:
org.apache.solr.util.ConcurrentLRUCache$Stats @ 0x6eac8fb88
Run Code Online (Sandbox Code Playgroud)
正在使用高达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}"/>
Run Code Online (Sandbox Code Playgroud)
查询结果具有相同的设置,但使用LRUCache并且它仅使用大约35mb的内存.是否有需要修复的配置有问题,或者我只需要更多内存用于过滤缓存?
Row*_*nto 12
在一位朋友告诉我过滤器缓存的工作原理有多大之后,很明显我们为什么会不时出现内存错误.
那么过滤器缓存有什么作用呢?基本上它创建类似于数组的东西,它告诉哪些文档与过滤器匹配.有些像:
cache = [1, 0, 0, 1, .. 0]
Run Code Online (Sandbox Code Playgroud)
1表示命中,0表示没有命中.因此,对于该示例,这意味着过滤器缓存匹配第0和第3个文档.因此,缓存有点像一个位数组,具有总文档的长度.因此,假设我有50万个文档,因此数组长度将为50百万,这意味着一个过滤器缓存将占用内存中的50.000.000位.
所以我们指定我们想要2000过滤器缓存,这意味着它将采取的RAM大致是:
50.000.000 * 2000 = 100.000.000.000 bit
Run Code Online (Sandbox Code Playgroud)
如果你把它转换为Gb.这将是:
100.000.000.000 bit / 8 (to byte) / 1000 (to kb) / 1000 (to mb) / 1000 (to gb) = 12,5 Gb
Run Code Online (Sandbox Code Playgroud)
因此,过滤器缓存所需的总RAM大约为12Gb.这意味着如果Solr只有6Gb堆空间,它将无法创建2000过滤器缓存.
是的,我知道Solr并不总是创建这个数组,如果过滤查询的结果很低,它只能创建一些占用更少内存的东西.这个计算只是粗略地说明过滤器缓存的上限是多少,如果它在ram中有2000个缓存.在其他更好的情况下它可以更低.
因此,一种解决方案是降低solr配置中的最大过滤缓存数量.我们检查了solr统计信息,大多数时候我们只有大约600个过滤器缓存,所以我们可以将过滤器缓存数量减少到最大值.
另一种选择当然是添加更多RAM.
一些选择:
如果在查询时,有时你知道fq将是非常罕见的,不要通过使用来缓存它
{!缓存= FALSE} FQ =的inStock:真
当然,获得更多内存是另一种选择
调查DocValues是否有帮助,他们确实在其他场景中帮助记忆(分面,排序......),但不确定它们是否与fq有关
如果您不是最新版本,请升级.
| 归档时间: |
|
| 查看次数: |
5370 次 |
| 最近记录: |