If you’re still looking for a good reason to spend a few minutes tuning your SOLR caches (documentCache, filterCache and queryResultCache), I’ll give you two numbers:
avgTimePerRequest : 126.148822 avgTimePerRequest : 70.026436
The first is with the default cache settings, the latter is with a very small change. Yep. That’s a 45% speed increase. So, the interesting question is what Iactually changed in the cache configuration – although I should warn you, the answer is very, very, very complicated:
The cache size. The default size (at least for our current 1.3 installation) is to keep 512 elements in the cache. When someone on the solr-user list asked for an introduction to what the different cache statistics meant, I remembered that I hadn’t actually tweaked the settings at all. The SOLR server has been running for a year now, so we now have a quite good idea of how it will perform and what kind of queries we are seeing. The stats indicated that a lot more cached entries got evicted than what I were hoping to see, and this gave us a lower cache hit rate (about 50%).
The simple change was to increase the size of the cache (from 512 to 16384), so that we’re able to keep more documents in memory before evicting them. After running 24 hours with the new setup we’re now seeing cache hits as 99%, 68% and 67%. The relevant sections of the solrconfig.xml file are:
<filterCache class="solr.LRUCache" size="16384" initialSize="4096" autowarmCount="4096" /> <queryResultCache class="solr.LRUCache" size="16384" initialSize="4096" autowarmCount="4096" /> <documentCache class="solr.LRUCache" size="16384" initialSize="4096" autowarmCount="4096" />
The document cache fills about 4 times as fast as the filter cache, so we might have to tweak the settings further by suiting it even better to our load pattern.
So what now?
The next step would be to try to change to the FastLRUCache which is included with Solr 1.4 (currently in SVN and nightlies). If my memory serves me right the changes are mostly related to locking, so I’m not sure if we’ll see any significant better performance.We’ll also make further adjustments to the size of each of the caches to better match our usage.
Comment from Grant Ingersoll: Be careful about caches that are too big, though. In some circumstances when a lot of garbage is produced do to evictions and new searchers, you can cause major collections to happen in the GC that causes the JVM to come to a standstill.