karlseguin / ccache

A golang LRU Cache for high concurrency
MIT License
1.29k stars 120 forks source link

How to get the max performance? #66

Closed devrodriguez closed 1 year ago

devrodriguez commented 3 years ago

Hi dude, what is the better way to get the max performance for ccache with concurrent transactions or without there? Tks.

karlseguin commented 3 years ago

There's no special configuration. You could increase the # of buckets to 32 or even 64 and, if you have long TTLs of oft-fetched items (and you're OK with occasionally evicting a recently fetched item), you could increase the GetsPerPromote beyond 3 (which I find already quite high).

ccache.New(ccache.Configure().MaxSize(X).Buckets(64).GetsPerPromote(5))

But you'd have to measure for your use case if those actually make a difference.

ccache has a lot of features (e.g. layered caching and external tracking)...if you just need a key=>value cache, and you're concerned about raw performance, there are probably faster alternatives. e.g. https://github.com/dgraph-io/ristretto

devrodriguez commented 3 years ago

Thanks for your answer!!! I'm increasing PromoteBuffer to 2048, this also contributes to improving the performance? On the other hand, what is the technical explanation for Promote? Thks dude!!!

karlseguin commented 3 years ago

Every instance of ccache has 1 worker threads which is responsible for maintaining the cache. This simplifies and minimizes the amount and type of locking that needs to take place.

When you get an item, rather than locking the linked list which tracks recency directly in the goroutine which performed the get, you write the information to a "promotables" channel (i.e.. promote as most recently use) which is consumed by the worker thread. (This linked list isn't under lock, since only the worker thread ever touches it).

A high promote buffer is a good idea. It'll ensure that read operations (e.g., Get) don't block.The current default, 1024, is probably too low given that the tradeoff is just a bit of extra memory. (Also, now that I think of it, I wonder if having 4-8 promotables channels to minimize their contention is a good idea...)