On 8/9/10 4:16 PM, Matthew Swift wrote:


On 28/07/10 13:07, Emmanuel Lecharny wrote:
 On 7/28/10 11:31 AM, Stefan Seelmann wrote:
I was thinking lately about the DN class. I know that OpenDS (and probably UnboundId, but not sure) has a DN.valueOf( "<a DN>" ) factory that returns a
DN potentially leveraging a cache associated to a ThreadLocal.

...
I don't think it's such a good idea :
- first, as it's ThreadLocal based, you will have as many cache as you have threads processing requests. Not sure it competes with a unique cache, not
sure either we can't use the memory in a better way...
An advantage to use ThreadLocal is that you don't need to synchronize
access to the cache Could be worth to measure the performance
Using ConcurrentHashMap should not be a major performance penalty. I mean, it *will* be more costly than not having any synchronization but it sounds acceptable.


Unfortunately a CHM won't help either since you need to manage cache eviction, assuming that you want the cache to have a finite size. LinkedHashMap has an eviction strategy which can be defined by overriding the removeEldestEntry method, but unfortunately LHM is not thread safe.

Doh !!! I should have thought about it immediately... That's the problem when you are pushing random thoughts on the ML instead of *really* coding them.

difference, I wonder if the OpenDS team did some performance analysis?


I did some testing some time back and I have forgotten the exact figures that I got. I do remember finding a substantial performance improvement when parsing DNs when caching is enabled - something like 30ns with caching vs 300ns without for DNs containing 4 RDN components (i.e. about an order of magnitude IIRC).

We implement our DNs using a recursive RDN + parent DN structure so we are usually able to fast track the decoding process to just a single RDN for DNs having a common ancestor (pretty common).

Our idea was that the first step would be to quickly compute the DN (as a String) hashcode, and check if it has already been parsed. If not, then we fallback to a plain parsing. But having the low level DN stored in the cache is a good idea.

There are definitively many options, we should conduct some perf tests based on real world DN to see what's the best.

We opted for the ThreadLocal approach due to the synchronization limitations of using a single global cache. However, I have often worried about this approach as it will not scale for applications having large numbers of threads, resulting in OOM exceptions.
yes, true. But this is also a fast-track solution, bringing immediate benefits.

Another approach I have thought about is to use a single global two-level cache comprising of a fixed size array of LinkedHashMaps (think of it as a Map of Maps) each one having its own synchronization. We then distribute the DNs over the LHMs and amortize the synchronization costs across multiple locks (in a similar manner to CHM).
Another aspect we are interested in is the pining of frequently used DN (cn=schema, etc). Not sure it worth the effort though...

This idea needs testing. In particular, we'd need to figure out the optimal array size (i.e. number of locks / LHMs). For example, distributing the cache over 16 LHMs is not going to help much for really big multi-threaded apps containing 16000+ threads (1000 threads contending per lock).
But are you going to have 16K threads anyway ?

A major problem with this approach if we choose to use it in the OpenDS SDK is that common ancestor DNs (e.g. "dc=com") are going to end up in a single LHM so, using our current design (RDN + parent DN), all decoding attempts will usually end up contending on the same lock anyway :-( So we may need to change our DN implementation to better cope with this caching strategy.

We are not alone though: a concurrent Map implementation which can be used for caching in a similar manner to LHM is one of the most frequently demanded enhancements to the java.util.concurrent library.
There might be some other data structure available, we may need to do some research in this area...


--
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com

Reply via email to