Hi,

I tried to integrate Apache DirectMemory as Second level cache (L2).
It uses Kryo  [2] for serializing/derserializing objects from the off
heap memory managed by DirectMemory. Initial test based on this show
quite a bit of saving in terms of memory taken

Below stats (sum of all MongoMK related cache) are taken when L2
memory is enabled after restarting a CQ instance and some basic access
done.

On Heap
    No of entries    - 138288
    Memory Taken - 217.3 MB
Off Heap
    No of entries    - 113012
    Memory Taken - 42.8 MB
    Hit Count 1257
    Total Load Time 80253030
    Avg Load Time 63844.8926014320

If I completely serialize the Document cache (the biggest of 3 )
- Document Cache - On Heap 134.7 MB for 43935 entries
- Document Cache - Off Heap 27.5 MB for 43935 entries. Takes 555.5 ms
to deserialize all 43935 entries

So far I can make following observation
-- Storing cache objects in serialized form provides a more compact storage
-- Deserializtion cost is low
-- Using Off heap memory would be helpful compared to on heap memory
-- Even if we do not use DirectMemory we can look into storing the
data in serialized form
-- L2 cache can be added as an optional feature. Oak Core can still be
used in absence of L2 cache

Caveats
-- DirectMemory project is still in very early phase and I have to use
the latest snapshot version with some local fixes to get it work

The required changes to be done can be checked at [3]

So would it be worthwhile to add this as an optional feature in Oak.
If user require they can enable L2 cache otherwise we only use the
Guava Cache as L1 cache

Thoughts?

Chetan Mehrotra

[1] http://directmemory.apache.org/
[2] https://code.google.com/p/kryo/
[3] 
https://github.com/chetanmeh/jackrabbit-oak/compare/apache:ab955ffd40e23a9f8aee87f9076bc045b643e35d...offheap

Reply via email to