阿里妹导读:本文介绍了非易失性内存在阿里巴巴集团生产环境的首次应用:线上运行的情况;使用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分配空间。

内存分配器

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

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

  • Cache Meta,存放了一些最大分片数之类的元数据信息,还有Slab Manager的索引信息。
  • Slab Manager,每个Slab Manager中管理固定大小的Slab。
  • Hashmap,全局哈希表索引,使用线性冲突链的方式处理哈希冲突,所有key的访问都需要经过Hashmap。
  • Page pool,内存池,启动之后会将内存划分成以1M为单位的页,Slab Manager会从Page pool中申请页,并格式化成指定的slab大小。

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

在使用NVM时,把对应的文件mmap到内存,获取虚拟地址空间,内置的内存管理模块就可以透明地利用这块空间了。所以在这个过程中,并不需要再调用malloc/free来管理NVM设备上的空间。

压测

Tair MDB在使用NVM作为DRAM的补充,辅助DRAM作为后端存储之后,在压测过程中遇到了一些问题,在这一章节会介绍这些问题的具体表现和优化的方法。

问题

使用了NVM之后,使用100 bytes的条目对Tair MDB进行了压测,得到如下的数据:

引擎内延迟

客户端观测QPS

基于NVM的Read QPS /latency和DRAM相当,Write TPS大概是DRAM的1/3。

分析

写性能的损耗从perf的结果上看都在锁上,这个锁管理的临界区包含的是对上文内存布局中提到的Page的写操作。怀疑这种情况是NVM上的写延迟比DRAM上高导致的。

在压测的过程中,使用pcm[3]查看NVM DIMMS的带宽统计,观察到在某一根DIMM上的写非常不均衡,稳定情况下大约是其它DIMM的两倍。

具体情况如下图所示:

这里先大概介绍下NVM DIMM的放置策略。

放置策略

现在使用单socket放置了4根 NVM DIMM,具体分布类似下图:

这种放置策略被称为2-2-1。每一个socket有4根 DIMM,分别属于四个不同的通道。在使用多个通道时,为了有效利用内存带宽CPU会进行interleave。当前放置策略和配置下,CPU以4K为单位,按照DIMM顺序进行interleave。

不均衡原因

从memory interleaving的策略,可以推断每次都会写同一个区域,而这片区域位于那根不均衡的DIMM上,导致这根DIMM的写入量会明显高于其它的DIMM。

那么接下来需要解决的问题就是找到导致写热点的处理逻辑。trivial的方法就是找些可疑的点,然后一个个排除下去,下面介绍下Tair工程团队使用的方法。

优化

上面提到了,写热点导致NVM DIMM访问不均衡,所以优化的第一步是先把写热点找出来,进行一些处理,比如说打散热点访问,或者把热点访问的区域放到DRAM中。

查找写热点

对于写热点的查找,Tair工程团队使用了Pin[4]。上面提到Tair MDB是对文件进行mmap获取逻辑地址来操作内存。于是我们可以使用Pin抓取mmap的返回值,进而得到NVM在程序内存空间中的逻辑地址。之后我们继续使用Pin对所有操作内存的程序指令进行插桩,统计对NVM映射到的地址空间中的每个字节的写入次数。

最终,发现写热点的确存在,相应的区域是Page的元数据。解决写热点的方案考虑过:加padding把热点交错到各个DIMM上、基本一样热的数据分DIMM存放、将热点移回DRAM等,最终选择将slab_manager和page_info移回DRAM。修改后结构如下:

至此,不均衡问题解决,TPS从85w提升至140w,此时引擎内写延迟从40us降低到12us。

锁开销过大

当TPS在140w时,注意到上面提到过的pthread_spin_lock的开销依然非常大。通过perf record的结果可以看到,pthread_spin_lock消耗的调用栈是:

通过分析batch_alloc_item发现临界区内对page中item的初始化操作会对NVM产生大量写入。由于NVM的写入速度比DRAM慢,所以这里成为一个很耗时的地方。

其实按照Tair MDB的逻辑,只有将page link进slab_manager的时候才需要加锁。因此这里将对item的初始化操作移出临界区。之后又对Tair MDB代码中临界区内所有对NVM的写入操作进行了排查,并进行了相应的优化。

优化之后pthread_spin_lock开销降低到正常范围内,TPS提升至170w,此时引擎内写延迟为9us。

优化结果

均衡写负载、锁粒度细化等优化有效地降低了Latency,TPS上升到了170w,相较之前的数据,TPS提高了100%。由于介质的差异,和DRAM的写性能相比依然有30%左右的差距,但是对于缓存服务读多写少的场景,这个差距对整体的性能并不会有太大的影响。

设计指引

基于上述的优化工作和生产环境的实践,Tair工程团队总结了基于NVM实现缓存服务的设计准则,这些准则是和使用的硬件特性有紧密联系的。

硬件特性

对缓存服务设计有影响的特有的NVM硬件特性:

  • 相对于DRAM密度更高,更便宜
  • 延迟相较DRAM高,带宽比DRAM低
  • 读写不均衡,写延迟相较读高
  • 硬件有磨损,频繁写单一位置会加大磨损

设计准则

准则A:避免写热点

Tair MDB在使用NVM的过程中遇到过写热点的问题,写热点会加大介质的磨损,而且会导致负载不均衡(写压力在某一根DIMM上,不能充分利用所有DIMM的带宽)。除了内存布局(元数据和数据混合存放)会导致写热点外,业务的访问行为也会导致写热点。

这里,Tair工程团队总结了几种避免写热点的方法:

  • 分离元数据和数据,将元数据移到DRAM中。元数据访问频率会相对于数据更高,前面提到的Tair MDB 中page_info属于元数据。这样可以从上层缓解NVM写延迟相较DRAM高的劣势。
  • 上层实现Copy-On-Write的逻辑。这样在一些场景下会减少对特定区域硬件的磨损,Tair MDB中更新一条数据时,并不会in-place update之前的条目,而是会新增条目添加到hashmap冲突链的头部,异步删除之前的条目。
  • 常态检测热点写,动态迁移到DRAM,执行写合并。对于上面提到的业务访问行为导致的热点写,Tair MDB会常态化检测热点写,并把热点写进行合并,减少对下层介质的访问。

准则B:减少临界区访问

由于NVM的写延迟相较DRAM高,所以当临界区中包含了对NVM的操作时,临界区的影响会放大,导致上层的并发度降低。

前面提到的锁开销,Tair MDB运行在DRAM上时并没有观测到,原因是运行在DRAM上,假设了这个临界区的开销比较小,但是使用NVM时,这个假设不成立了。这也是在使用新介质时经常会遇到的问题,以往软件流程中可能没有意识到的一些假设,在新介质上不成立了,这时候就需要对原有的流程进行一些调整。

鉴于上面的原因,Tair工程团队建议缓存服务使用NVM时,应该尽量地结合数据存储做无锁化的设计,减少临界区的访问,规避延迟升高带来的级联影响。

Tair MDB引入了用户态RCU,对大部分访问路径上的操作进行了无锁化改造,极大地降低了NVM延迟对上层带来的影响。

准则C:实现合适的分配器

分配器是业务使用NVM设备的基础组件,分配器的并发度会直接影响软件的效率,分配器的空间管理会决定空间利用率。设计实现或者选择适合于软件特性的分配器,是缓存服务使用NVM的关键。

从Tair MDB的实践上来看,适用于NVM的分配器应该具备以下功能和特性:

  • 碎片整理:由于NVM有密度更高、容量更大,所以在相同碎片率下,相较于DRAM会浪费更多的空间。由于碎片整理机制的存在,所以需要上层应用避免in-place update,而且尽量保证分配器分配的空间是fixed size。
  • 需要有Threadlocal的quota:和上面说的减小临界区访问类似,如果没有Threadlocal的quota,从全局的资源池中分配资源的延时会降低分配操作的并发度。
  • Capacity-aware,分配器需要感知所能管理的空间: 缓存服务需要对管理的空间进行扩容或者缩容,分配器需要提供相应的功能以适配这个需求。

以上这些设计准则都是在实践中检验过,切实可行,而且会对应用带来有利的影响,相信对其它希望使用NVM的产品也会有非常大的帮助。

未来的工作

上面提到了Tair MDB使用NVM时还是当作易失性的设备,利用了密度大价格低的优势来降低整体服务的成本。未来Tair工程团队会致力于更好地利用NVM的非易失特性,挖掘新硬件的红利,赋能于业务和其它上层的服务。

本文是阿里巴巴集团存储技术事业部Tair团队关于NVM的系列分享的开篇,接下来会陆续推出我们在NVM领域的思考和成果。

分布式在线存储系统Tair 专注于承担超大流量下的在线访问加速,阿里巴巴集团大规模使用,在每秒数亿次访问请求的背后,提供着超低延时的响应。场景包括各类在线缓存,内存数据库,高性能持久化NoSQL数据库等,在高并发,快速响应和高可用上追求极致。在这里,你会遇到亿级别访问的尖峰时刻,不同类型业务错综复杂的场景需求,万台规模服务器集群的运营支撑,业务全球化等各类技术挑战。

最后,我们也欢迎各位牛人加入我们团队,

欢迎访问:https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP052397

看看是否有你心仪的岗位!

参考资料:

[1]https://github.com/pmem

[2]https://github.com/memkind/memkind

[3]https://github.com/opcm/pcm

[4]https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool

[5]《揭秘!双11万亿流量下的分布式缓存系统 Tair》

[6]《Persistent Memory Programming: The Current State of the Ecosystem》

(http://storageconference.us/2017/Presentations/Rudoff.pdf)

[7]《Persistent Memory: What’s Done, Coming Soon, Expected Long-term》

(https://blog.linuxplumbersconf.org/2015/ocw/system/presentations/3015/original/plumbers_2015.pdf)

每天一篇技术文章,

看不过瘾?

关注“阿里巴巴机器智能”微信公众号

发现更多AI干货。

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

  1. Linux文件系统与持久性内存介绍:块设备、闪存(NAND/NOR)、NVDIMM(非易失性内存)、PMEM(PMDK)- ndctl

    <持久内存开发套件(Persistent Memory Development Kit-PMDK) - pmem.io: PMDK> <PMDK介绍> <PMDK(NVM ...

  2. 面向非易失性内存的持久索引数据结构研究综述

    点击上方蓝字关注我们 面向非易失性内存的持久索引数据结构研究综述 王永锋, 陈志广 中山大学计算机学院,广东 广州 510006 摘要:随着非易失性内存从理论走向实用,现代存储系统的设计与实现将迎来颠 ...

  3. 今晚直播 | PostgreSQL基于非易失性内存优化探索

    PostgreSQL基于非易失性内存优化探索-07/22 Intel于2019年首次完成PCM商品化,其3D XPoint傲腾系列持久内存新硬件具有可字节寻址.非易失.大容量.堪比内存的速度特性,这种 ...

  4. 或取代当前非易失性内存技术 Crossbar正式进军中国存储市场

    阻变式存储器(RRAM)技术的领导者Crossbar公司日前宣布正式进军中国市场,并在上海设立新的办事处. 目前,Crossbar RRAM能够在邮票大小的芯片上实现太字节(terabyte)存储,而 ...

  5. Linux傲腾DC128G内存设置,Intel发布傲腾DC非易失性内存:3DXpoint、128GB起、服务器专用...

    Intel今日举行了内存存储日活动上,会议上正式发布了3DXpoint黑科技DDR4内存Optane DC Persistent Memory,一看名字就知道不是我们普通人能用上的,单条128GB起步 ...

  6. 非易失性内存技术及数据库

    非易失性内存技术及数据库 内容 "2013年开始这个项目的研究,当时不确定非易失性内存技术是否可商用.2019年Intel商用了NVM产品,NVM对下一代数据库系统的影响吸引了广大研究者&q ...

  7. NVM(NonVolatile Memory)(非易失性内存)

    NVM特性 NonVolatile Memory,非易失存储器,具有非易失.按字节存取.存储密度高.低能耗.读写性能接近DRAM,但读写速度不对称,读远快于写,寿命有限(需要像ssd一样考虑磨损均衡) ...

  8. 非易失性数据库系统存储与恢复方法

    非易失性数据库系统存储与恢复方法 摘要 非易失性内存的出现从根本上改变了数据库管理系统的内存和持久存储的架构.这些新型NVM设备具有堪比DRAM的速度,但是写到NVM设备后这些数据就具备了持久性.因为 ...

  9. 非易失性NV-SRAM简介

    尽管闪存和其他非易失性存储技术已广泛用于实现嵌入式文件系统,但对于某些嵌入式应用程序来说可能太复杂了.在许多情况下的内存可以最有效地用作已预先初始化的数据结构.这种方法需要对数据完整性进行某种管理.本 ...

最新文章

  1. vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
  2. 开源项目贡献者_如何吸引新的贡献者加入您的开源项目
  3. 中小企业网站建设不妨试试快速建站
  4. 【LeetCode】两数之和
  5. excel if in函数_【Excel函数】Small+Index+IF 一对N返回
  6. Web前端笔记-element ui中table中禁止换行,使用...进行省略
  7. 卷积神经网络的几种典型架构
  8. c语言筛选法_「干货」C语言经典算法筛选法求质数,极少数人用过的素数求解法...
  9. BZOJ 1507 [NOI2003]Editor
  10. linux_shell/windows_powershell_变量/环境变量Path的分行/换行查看/关键字搜索环境变量是否已经存在相关的变量的一些函数(cmdlet)表达式
  11. CSS3淘宝支付成功打勾动画代码
  12. python 声音指纹识别,Python-samp中的Dejavu音频指纹识别
  13. java从键盘输入任意一组数据存入数组中统计非负数个数及非负数个数
  14. 16位院士加盟!“双一流”上海大学成立人工智能研究院
  15. android程序设计拍照,Android编程实现拍照功能的2种方法分析
  16. python颜色画线_matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
  17. 惠普ZBook 14u G5(3XG37PA)电脑 Hackintosh 黑苹果efi引导文件
  18. 【解决方案 十二】一文彻底解决文件格式判别问题
  19. 绝望的主妇第八季/Desperate Housewives迅雷下载
  20. 牛客练习赛87 -A-中位数

热门文章

  1. Python实现的导弹跟踪算法,燃!
  2. 请收藏,Linux 运维必备的 40 个命令总结,收好了~
  3. 有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
  4. 李沐等将目标检测绝对精度提升 5%,不牺牲推理速度
  5. redis java应用_Java+Redis应用(第一章)
  6. vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号
  7. 批处理 批量s扫1433_申报资料 | 批量整理图谱(续)
  8. 计算机在机电一体化应用论文2000字,机电一体化论文3000字范文参考(5)
  9. windows href 可以设置header吗_windows电脑端有什么桌面办公便签可以设置农历时间提醒?...
  10. 用c语言编程序输入一个正整数,编写一个程序,输入一个正整数n(假设n7),求1!+2!+3!+4!+……+n!...