On Sun, Dec 30, 2012 at 6:41 PM, Yunkai Zhang <yunkai...@gmail.com> wrote:
> > > > On Sun, Dec 30, 2012 at 12:50 PM, Yunkai Zhang <yunkai...@gmail.com>wrote: > >> >> >> >> On Sun, Dec 30, 2012 at 12:17 PM, John Plevyak <jplev...@acm.org> wrote: >> >>> Lol, If they have optimized it by removing the LRU nature, it was perhaps >>> overzealous, or perhaps your workload is such that it fits within the RAM >>> cache so replacement is not an issue. Without the LRU there are >>> approximately the same number of buckets as objects, so replacement based >>> on bucket would be largely random. Instead we can have a partitioned >>> LRU, and we are probably going to have to go that route as it looks like >>> lock contention in the cache is pretty bad. That's the next area I was >>> thinking of looking at... >>> >> >> >> It seems that my coworker split the original one LRU queue into multiple >> queues according data size(e->data->_size_index). What they do is not to >> optimize LRU itself, but to reduce memory fragment caused by allocate/free >> memory frequently. >> >> I'll send that patch to here, and hope you can give some advise. >> > > > Hi jonh: > > I have post the path in > TS-1006<https://issues.apache.org/jira/browse/TS-1006>issue's page, there is > the patch's > link<https://issues.apache.org/jira/secure/attachment/12562712/0006-RamCacheLRU-split-LRU-queue-into-multiple-queues-to-.patch> > . > sorry, s/there is the patch's/here is the path's/ :D > > Welcome to give us some advise:) > > > >> >> >>> >>> cheers, >>> john >>> >>> On Sat, Dec 29, 2012 at 7:59 PM, Yunkai Zhang <yunkai...@gmail.com> >>> wrote: >>> >>> > On Sun, Dec 30, 2012 at 1:57 AM, John Plevyak <jplev...@acm.org> >>> wrote: >>> > >>> > > This code in ::put() implements the LRU, and as you can see, it uses >>> the >>> > > LRU data structure (i.e. simple list from most recently used to >>> least): >>> > > >>> > > while (bytes > max_bytes) { >>> > > RamCacheLRUEntry *ee = lru.dequeue(); >>> > > if (ee) >>> > > remove(ee); >>> > > else >>> > > break; >>> > > } >>> > > >>> > >>> > It seems that the code I read had been changed on this section you >>> showed >>> > above, as my coworker have optimized it a bit. But thanks for your >>> > explanation all the same. >>> > >>> > >>> > > >>> > > >>> > > >>> > > On Sat, Dec 29, 2012 at 9:39 AM, Yunkai Zhang <yunkai...@gmail.com> >>> > wrote: >>> > > >>> > > > Hi folks: >>> > > > >>> > > > I'm reading code about RamCacheLRU, but I was confused by >>> > > RamCacheLRU->lru >>> > > > queue defined as following: >>> > > > >>> > > > struct RamCacheLRU: public RamCache { >>> > > > ... >>> > > > Que(RamCacheLRUEntry, lru_link) lru; >>> > > > DList(RamCacheLRUEntry, hash_link) *bucket; >>> > > > ... >>> > > > }; >>> > > > >>> > > > By reading put/get/remove functions of RamCacheLRU class, it seems >>> > that >>> > > > LRU algorithm was implemented by accessing *bucket* list instead of >>> > *lru* >>> > > > queue. >>> > > > >>> > > > Do I understand it correctly? if so, we can remove lru queue and >>> > relative >>> > > > code to speed up the put/get function of LRU a bit. >>> > > > >>> > > > -- >>> > > > Yunkai Zhang >>> > > > Work at Taobao >>> > > > >>> > > >>> > >>> > >>> > >>> > -- >>> > Yunkai Zhang >>> > Work at Taobao >>> > >>> >> >> >> >> -- >> Yunkai Zhang >> Work at Taobao >> > > > > -- > Yunkai Zhang > Work at Taobao > -- Yunkai Zhang Work at Taobao