主要参考:
在新的版本中需要使用“-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,也就是过期时间。
同样,也可以看一下官网的英文解释。