memcache1.5.8——LUR策略

主要参考:
在新的版本中需要使用“-o lru_maintainer” 来开启新版本的LRU。

以前的:
每一个slab class由一个独立的双向链表管理LRU。在最后的items会被reclaimed或者evicted。

新版本的LRU有很大的变化:
  • LRU被分成hot、warm、cold三个部分。新的item会被放在hot中。
  • item被访问2次以上才认为是激活。
  • 只有当item到LRU的底部时才会进行LRU。如果是在hot区被激活,那么会被放在warm区,如果在warm区被激活,会继续待在warm区。如果在cold区被激活,会进入到warm区。
  • hot区和warm区占slab class的N%,cold无上限
  • items从hot区和warm区流向cold区
  • 有一个后台线程进行处理需要LRU的items,同时也包括把item从cold区移动到warm区。

这样做的目的是为了保护激活的对象被“扫描”。从来没有被激活的items会从host区直接到cold区。items偶尔被激活后会移动到warm区。这样items能够得到相对的保护。

第二点是为了改善延迟。LRU锁不再用于大多数item的读取,主要在集合和后台线程中。同时后台线程能够异步的找到过期的items并且释放资源给slab class,这样能够加快新的分配。


当然还有一个设置“-o temporary_ttl=N”,这个设置能够使TTL小于N的items被放在temp LRU中,再temp LUR区域中的是永远不会被淘汰的。但是这个TTL的值建议不要设置的太大,不然会有大量的内存消耗。
这里的TTL是time to live,也就是过期时间。


同样,也可以看一下官网的英文解释。

猜你喜欢

转载自blog.csdn.net/wild46cat/article/details/80916679