非易失性内存在阿里生产环境的首次应用:Tair NVM最佳实践总结

640?wx_fmt=jpeg

阿里妹导读:本文介绍了非易失性内存在阿里巴巴集团生产环境的首次应用:线上运行的情况;使用NVM遇到的问题和优化的过程;最后,总结性地给出了基于NVM构建缓存服务的设计要点,希望这些实践总结能对大家的工作有所启发。


简介


Tair MDB是阿里巴巴生态系统内广泛使用的缓存服务,它采用非易失性内存 Non-volatile memory (NVM)作为DRAM的补充,辅助DRAM作为后端存储介质,从天猫618购物节开始在生产环境上线灰度,经历了2次全链路压测,至今运行稳定。在使用NVM的过程中,Tair MDB遇到了写不均衡、锁开销等问题,经过优化之后取得了非常显著的效果。


通过这一系列优化工作和生产环境的实践,Tair工程团队总结出了一些在Non-volatile memory (NVM) / Persistent memory (PMEM)上实现缓存服务的设计准则,相信这些准则对其它有意愿使用Non-volatile memory来进行优化的产品会非常有指导意义。


背景


Tair Mdb主要服务于缓存场景,在阿里巴巴集团内部有着大量的部署和使用。随着用户态网络协议栈、无锁数据结构等特性的引入,单机QPS极限能力已经达到了1000w+的级别。Tair Mdb所有的数据都是存储在内存中,随着单机QPS极限能力的上升,内存容量逐渐成为限制集群规模的主要因素。


NVM产品单根DIMM的容量相对于DRAM DIMM要大很多,价格相对于DRAM更有优势,将Tair Mdb的数据存放在NVM上,是突破单机内存容量的限制的一个方向。


生产环境


效果


端到端,读写平均延时和相同软件版本下使用DRAM的节点数据持平;服务行为表现正常。生产环境的压力并没有达到Tair MDB节点的极限,后面的章节会介绍压测时我们遇到的问题和解决方案。


成本


前面提到了单根NVM DIMM最大容量比DRAM DIMM要高,相同容量的价格会比DRAM便宜。Tair MDB容量型的集群,如果采用NVM来补充内存容量的不足,规模可以大幅减少。算上机器价格、电费、机架等因素,成本大约可以降低30% ~ 50%左右 。


原理


使用方式


Tair MDB使用NVM设备的方式,是把NVM以块设备的形式使用Pmem-Aware File System挂载(DAX挂载模式)。分配NVM空间对应的操作是在对应的文件系统路径上创建并打开文件,使用posix_fallocate分配空间。

640?wx_fmt=png


内存分配器


NVM本身具备非易失的特性,对于缓存服务Tair MDB,是把NVM当作易失性设备,不需要去考虑操作的原子性和crash之后的recovery操作,也不需要显式地调用clflush/clwb等命令将CPU Cache中的内容强制刷回介质。


使用DRAM空间时,有tcmalloc/jemalloc等内存分配器可供选择,现在NVM的空间暴露给上层的是一个文件(或者是一个字符设备),所以如何使用内存分配器是首先需要考虑的事情。开源项目pmem[1]中维护了易失性的内存管理库libmemkind,有易用的类malloc/free的API,大部分应用接入时可以考虑这种方式。


Tair MDB在实现时并没有使用libmemkind[2]。下面介绍Tair MDB的内存布局,说明做出这种选择的原因。


内存布局


Tair MDB在内存管理上使用了slab机制,不是在使用时动态地分配匿名内存,而是在系统启动时先分配一大块内存,内置的内存管理模块会把元数据、数据页等在这一大块内存上连续分布,如下图所示:


640?wx_fmt=png


Tair MDB使用的内存主要分为以下几部分:


  • Cache Meta,存放了一些最大分片数之类的元数据信息,还有Slab Manager的索引信息。

  • Slab Manager,每个Slab Manager中管理固定大小的Slab。

  • Hashmap,全局哈希表索引,使用线性冲突链的方式处理哈希冲突,所有key的访问都需要经过Hashmap。

  • Page pool,内存池,启动之后会将内存划分成以1M为单位的页,Slab Manager会从Page pool中申请页,并格式化成指定的slab大小。


Tair Mdb会在启动时对所有可用的内存进行初始化,后续数据存储部分不需要动态地从操作系统分配内存了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值