[
https://issues.apache.org/jira/browse/JCR-1112?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12528718
]
Martijn Hendriks commented on JCR-1112:
---------------------------------------
Hi,
I think that there are some issues with the current CacheManager that could be
improved:
- The MLRUItemStateCache.touch method triggers the CacheManager.cacheAccessed
method, which may call resizeAll. When the system is heavily loaded, many
threads may unnecessarily be blocked by the synchronized block in
CacheManager.cacheAccessed. The chances for this increase as SLEEP decreases
and the time needed for resizeAll increases. This could easily be improved .
- The resizeAll method is expensive (for MLRUItemStateCaches, which are used
everywhere) because it calls MLRUItemStateCache.getMemoryUsed, which
recalculates the size of each entry in the cache (linear complexity in the size
of the cache...). Since the NodeState/PropertyState.calculateMemoryFootprint
seem to give approximate values anyway, wouldn't it be an idea to keep track of
the approximate cache size in the MLRUItemStateCache itself? Furthermore,
getMemoryUsed even blocks read-access to the cache. A large shared cache such
as the one of the SharedItemStateManager suffers significantly from this, I
think.
The minimum time between rebalancing seems small but, as Thomas noted, there
are certain use-cases where this is needed. Isn't there a way to detect such
extreme cache blowups in another way? When, for instance, a MLRUItemStateCache
keeps track of its own approximate size, the time derivative of this size could
be used to prevent blowups.
Best wishes,
Martijn
> CacheManager interval between recalculation of cache sizes should be
> configurable
> ---------------------------------------------------------------------------------
>
> Key: JCR-1112
> URL: https://issues.apache.org/jira/browse/JCR-1112
> Project: Jackrabbit
> Issue Type: New Feature
> Components: core
> Reporter: Przemo Pakulski
> Assignee: Thomas Mueller
> Priority: Minor
> Attachments: JCR-1112.txt
>
>
> Currently interval between recaluclation of cahce size is hard coded to 1000
> ms. Resizing/recalculation of cache size is quite expensive method
> (especially getMemoryUsed on MLRUItemStateCache is time consuming)
> Depending on the configuration, we realized that under some load up to 10-15%
> percent of CPU time (profiler metrics) could be spend doing such
> recalculations. It does not seem to be needed to resize cache every second.
> Best this interval should be configurable in external config. file with other
> cache settings (like memory sizes).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.