memcached1.5更好的LRU算法,了解下Maintainer线程

从 Memcached1.5 开始,实现了一个改良的 LRU 算法,也叫做分段 LRU(Segmented LRU)算法,新算法主要是为了更好的利用内容,并提升性能。包括了二个重要的线程,本文先讲解 maintainer 线程,后一篇讲解 crawler 线程。

每个 Slab-class 有一个 LRU,每个 LRU 又由四个子 LRU 组成,每个子 LRU 维护独立的锁(mutex lock),所有的 LRU 由一个独立的线程维护(这和旧的 LRU 算法有很大的不同),称之为 “LRU maintainer” 线程。

每个 item 有一个 flag,存储在其元数据中,标识其活跃程度:

  • FETCHED:如果一个 item 有请求操作,其 flag 等于 FETCHED。
  • ACTIVE:如果一个 item 第二次被请求则会标记为 ACTIVE;当一个 item 发生 bump 或被移动了,flag 会被清空。
  • INACTIVE:不活跃状态。

这四个子 LRU 包含了四个独立的 queue,相关的 queue 可能会迁移到其他的 queue,这么设计就是为了减少 bump 的产生,先看一张图:

memcached1.5-lru-fd-jg.png

(1)HOT queue:如果一个 item 的过期时间(TTL)很短,会进入该队列,在 HOT queue 中不会发生 bump,如果一个 item 到达了 queue 的 tail,那么会进入到 WARM 队列(如果 item 是 ACTIVE 状态)或者 COLD 队列(如果 item 处于不活跃状态)。

(2)WARM queue:如果一个 item 不是 FETCHED,永远不会进入这个队列,该队列里面的 item TTL 时间相对较长,这个队列的 lock 竞争会很少。该队列 tail 处的一个 item 如果再一次被访问,会 bump 回到 head,否则移动到 COLD 队列。

(3)COLD queue:包含了最不活跃的 item,一旦该队列内存满了,该队列 tail 处的 item 会被 evict。

如果一个 item 被激活了,那么会异步移动到 WARM 队列,如果某个时间段内大量的 COLD item 被激活了,bump 操作可能会处于满负载,这个时候它会什么也不做(不移动到 WARM queue),避免影响工作线程的性能。

(4)TEMP queue:该队列中的 item TTL 通常只有几秒,该列队中的 item 永远不会发生 bump,也不会进入其他队列,节省了 CPU 时间,也避免了 lock 竞争。

HOT 和 WARM LAU queue 有内存使用的限制,而 COLD 和 TEMP 队列没有内存使用限制,这主要是为了避免一些不经常使用的 item 长期占据在相对活跃的队列中。

总结下 LRU Maintainer 线程的任务:

  • 迭代每个子 LRU(每个 Slab-class 有4个),然后查看 tail 部的 item。
  • 查看每个子 LRU 的内存限制,必要的时候移出一些。
  • 回收 tail 部的过期 item(更多的回收由 LRU Crawler 线程处理,后面会说)。
  • 异步处理 COLD queue 的 bump 操作(会产生锁)。

除了让内存使用更有效,分段 LRU 还有一些好处:

  • 直接 get 的时候不会产生 bump,这对于工作线程的扩展性有好处,而且也不会产生 lock 等待。
  • bump 操作都是异步发生的。
  • 写操作扩展性更好,比如不会不会在 set 的时候产生内存回收操作。
  • 每个 item 的元数据不会变多,

从 memcached1.5开始,分段 LRU 机制默认是启用的,如果想显式启用,可以运行下列两个命令中的任意一个:

$ ./memcached -o modern

$ ./memcached -o lru_maintainer

如果 memcached 是 1.4 版本,也可以使用下列命令启动:

$ ./memcached -o modern

在 memcached 运行的时候,也可以通过内部命令动态调整 LRU 算法,比如:

# 使用传统的 LRU 算法 
$ lru mode flat 

# 使用分段 LRU 算法 
$ lru mode segmented 

如果采用分段 LRU 算法,还有更多的子命令参数可以使用:

$ lru tune 10 25 0.1 2.0 

其中 10 表示 hot 队列的内存占比不能超过 10%,WARM 队列的内存占比不能超过 25%, HOT 队列 tail age 大于 COLD 队列 tail age 的 10%,WARM 队列的 tail age 是 COLD 队列 tail age 的 2 倍。

至于这些参数的作用,引用下面的解释(更容易理解):

HOT and WARM LRU’s are limited in size primarily by percentage of memory used, while COLD and TEMP are unlimited. HOT and WARM have a secondary tail age limit, relative to the age of the tail of COLD. This prevents very idle items from persisting in the active queues needlessly.

另外一个配置:

$ lru temp_ttl ttl

如果 ttl 值小于0,表示禁用 TEMP queue;如果大于 0,那么过期时间小于 TTL 的 item 就会进入 TEMP queue,而且除非 item 过期或删除,否则不会离开该队列。

可以通过 stats settings 了解更多分段 LRU 的设置:

参数 说明
lru_maintainer_thread 是否启用 maintainer 线程
lru_segmented 是否启用 分段 LRU
hot_lru_pct HOT LRU 占所有 LRU 内存的百分比
warm_lru_pct WARM LRU 占所有 LRU 内存的百分比
hot_max_factor HOT 队列 tail age 大于 COLD 队列 tail age 的值
warm_max_factor WARM 队列 tail age 大于 COLD 队列 tail age 的值
temp_lru 是否启用 TEMP LRU
temporary_ttl 小于该值的 item 进入 TEMP LRU

可以通过 stats 命令了解分段 LRU 的运行数据:

参数 说明
moves_to_cold 从 HOT/WARM 移动到 COLD 的 item 个数
moves_to_warm 从 COLD 移动到 WARM 的 item 个数
moves_within_lru HOT or WARM 交换的个数

也可以输入 stats item 了解详细的分段 LRU 运行数据:

参数 说明
number_hot 目前在 HOT LRU 中的 item 个数
number_warm 目前在 WARM LRU 中的 item 个数
number_cold 目前在 COLD LRU 中的 item 个数
number_temp 目前在 TEMP LRU 中的 item 个数
age_hot HOT LRU 中最老 item 的时间
age_warm WARM LRU 中最老 item 的时间
age LRU 中最老 item 的时间

memcached 相关文章:


欢迎大家关注我的公众号(ID:yudadanwx,虞大胆的叽叽喳喳),所有文章都是原创,主要来源于平时工作中遇到的问题和学习中的一些想法;也可以了解我的书《深入浅出HTTPS:从原理的实战》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容