Solr使用不同的缓存来防止请求期间过多的IO访问和计算。 当索引不是很频繁发生时,您可以通过使用这些缓存来获得巨大的性能提升。 根据索引数据的结构和缓存的大小,它们可能会变得很大,并占用堆内存的很大一部分。 在本文中,我想展示如何使用Eclipse Memory Analyzer来查看缓存实际在内存中使用了多少空间。
配置缓存
可以在query
部分的solrconfig.xml中配置所有Solr缓存。 您会发现如下定义:
<filterCache class="solr.FastLRUCache"size="8000"initialSize="512"autowarmCount="0"/>
这是配置为使用FastLRUCache
的筛选器缓存的FastLRUCache
,最大大小为8000个项目,并且没有自动预热。 Solr附带了两个常用的缓存实现,即FastLRUCache
和FastLRUCache
,它们使用ConcurrentHashMap
和LRUCache
来同步调用。 某些缓存仍配置为使用LRUCache
但在一些读取繁重的项目上,我也将其更改为FastLRUCache
,因此效果很好。
另外,从Solr 3.6开始,还有LFUCache 。 我从未使用过它,它仍然标记为实验性的,随时可能更改。
Solr带有以下缓存:
过滤缓存
缓存过滤器查询的位集。 如果要重新使用过滤器,这可能是非常有效的缓存。
QueryResultCache
存储用于查询的文档ID的有序列表。
文档缓存
缓存Lucene文档的存储字段。 如果字段很大或很多,则此缓存可能会变得很大。
FieldValueCache
主要用于构面的缓存。
另外,您还将看到对FieldCache的引用,该引用不是Solr管理的缓存,无法配置。
在默认配置中,Solr每个高速缓存仅高速缓存512个项目,这通常可能太小。 您可以在核心的Plugin / Stats / Caches部分的Solr的管理视图中查看缓存的使用情况。 这将告诉您命中率以及缓存的逐出。
这些统计信息是调整缓存的一个很好的起点,但是您应该意识到,通过将大小设置得太大,您会看到一些不必要的GC活动。 这就是为什么查看内存中缓存的实际大小而不是仅查看项目数可能有用的原因。
Eclipse垫
Eclipse MAT是查看内存中的堆并查看哪些对象占用空间的好工具。 顾名思义,它基于Eclipse,可以作为独立工具下载,也可以通过更新站点获得,以集成到现有实例中。
可以使用该工具直接获取堆转储,但您也可以打开现有的转储。 如果您在缓存中保留许多项目,则打开后它将自动计算可能已经包含某些缓存对象的最大对象的图表。
使用饼图下方的链接,您还可以打开更多的自动报告,例如,“最大消费者”,这是有关大型对象的更详细页面。
即使您确实在此处看到了某些缓存类,也无法真正看到消耗内存的是哪个缓存。 使用报告顶部的“查询浏览器”菜单,您也可以直接列出类的实例,无论它们有多大。
我们选择带有传出引用的列表对象,然后输入FastLRUCache org.apache.solr.search.FastLRUCache
的类名称。 对于默认配置,您将看到两个实例。 单击其中一个实例时,您可以在左下方窗口中看到缓存的名称,在本例中为过滤器缓存。
堆大小有两个可用的数字: 浅大小和保留大小 。 当查看缓存时,我们会对保留的大小感兴趣,因为这是实例被垃圾回收时可用的大小,即仅由缓存使用的缓存的大小。 在我们的情况下,这大约是700kB,但这会增长很多。
您也可以对org.apache.solr.search.LRUCache
做同样的检查,以查看缓存的实际大小。
结论
缓存可以比这里的示例大很多。 Eclipse Memory Analyzer已经帮助我很多了,看看堆太大的问题是否存在。
翻译自: https://www.javacodegeeks.com/2014/05/see-your-solr-cache-sizes-eclipse-memory-analyzer.html