Solr Cache最佳实践帮你轻松调优
背景
分类
QueryResult Cache:缓存query对应的docid拉链,数据结构:query => docid list
Filter Cache:缓存filter对应的bitmap索引,数据结构:filter => bitmap (total doc number bit)
Doc Cache:缓存doc id对应的stored的doc文档内容,数据结构:doc id => doc content
Custom Cache,自定义cache,默认关闭,本文档中不再介绍
配置
<filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0" />
<queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />
<documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />
-
前2者还可以设置maxRamMB参数(版本要求:solr 6.6中不能配置,7.3.1可以):该类cache的使用内存上限,单位是MB。如果配置了它的话,size和initialSize参数将被忽略 -
另外cache的生效时间受到auto/autosoft commit参数的影响,目前最新gptext代码中配置如下:
autocommit不会导致cache失效(因为设置了opensearcher为false)
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>60000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
autosoftcommit导致cache失效:每Docs/Time个周期到了会导致cache失效
<autoSoftCommit>
<maxDocs>100000</maxDocs>
<maxTime>600000</maxTime>
</autoSoftCommit>
内存开销
每个query/filter 10 Byte
平均结果数目:25万条(每条结果id使用一个8byte整数代表)
总文档数目:10亿(使用一个bitmap,每个文档占1bit)
平均stored文档大小:32 Byte(4个8byte字段)
cache和autocommit参数都是默认值
queryresult cache:(10+250000*8) * 512 = 1GB (最差情况下)
filter cache:(1000000000/8) * 512 = 60GB (最差情况下)
doc cache:32 * 512 = 16KB
监控
如果可以访问SOLR UI,可以查看每个core上的cache metrics统计:
http://localhost:18983/solr/#/demo.public.test_wiki_shard1_replica_n2/plugins?type=cache
如果无法访问SOLR UI,直接通过如下url查看:
http://localhost:18983/solr/admin/metrics?group=core&prefix=CACHE.searcher.queryResultCache
http://localhost:18983/solr/admin/metrics?group=core&prefix=CACHE.searcher.filterCache
http://localhost:18983/solr/admin/metrics?group=core&prefix=CACHE.searcher.documentCache
例如,通过SOLR UI查看metrics项目
配置实践
本文将要给出每类cache size的通用设置方法:
首先,持续运行系统一段时间(如一天/一周等),然后搜集如下系统参数:
如果未发生OOM,请按照如下流程图来处理:
1.filter cache
如前文中实例,一般它是对空间需求最高的cache类型,OOM很可能是由它导致
检查cumulative_hitratio
a. 如果高(表明cache非常有效),为它设置一个能接受的maxRamMB值 b. 如果低,直接关闭(设置size为0)
通常不应该关闭它(往往能发挥作用,如重复搜索一个query)值
检查cumulative_hitratio
a. 如果高,为它设置一个能接受的maxRamMB b. 如果低,设置一个较小的maxRamMB值
通常情况下不是内存瓶颈,因此请首先处理好前2类cache
参考
关于作者
马洪旭,Pivotal资深研发工程师 & Apache HAWQ committer,专注于数据库领域并热爱开源技术,目前在Pivotal从事GPText研发工作。