win10 固态nvm优化_同步进行:NVM缓存优化指南

win10 固态nvm优化

阿里巴巴缓存技术团队的最佳实践,如何将非易失性内存(NVM)最佳地部署到生产环境

有效的数据存储对于任何计算任务都是必不可少的,但是当您运行一个为数十亿消费者服务的电子商务平台的多部门生态系统时,这是无可替代的。 对于运营着全球最大在线市场的阿里巴巴来说,这意味着开发自己的非易失性存储器(NVM)缓存服务包(统称为Tair MDB),首先是为支持Tmall 6.18在线购物节而进行的,然后进行优化以扩大推广范围。

为了诊断出必要的改进,Tair团队对该系统进行了两次全链路压力测试,从而发现了一系列问题,包括书写不平衡和锁定开销。 今天,我们更加仔细地研究阿里巴巴生产环境中的NVM基础知识,重点是在优化工作中发现的最佳实践。 以及有助于确保长期可操作性的三个战略设计规则,在相关领域工作的读者会发现有关广泛应用于其他产品的NVM优化的丰富见解。

NVM的案例

在采用NVM时,Tair MDB已在阿里巴巴集团内广泛部署。 随着用户空间网络协议栈和无锁数据结构的引入,单个单元的QPS限制已超过1000瓦口径。 Tair MDB的所有数据都存储在内存中,单机QPS限制增加了,使得内存容量成为决定群集大小的最重要因素。

NVM提供了更高的单个DIMM容量,同时也比DRAM便宜得多,这表明有可能突破单个单元内存容量的限制。

NVM进入生产环境:初步结果

端到端,在相同软件版本下使用DRAM的节点数据的平均读写延迟级别,使用NVM证明服务能够正常运行,并且生产环境的压力远低于Tair MDB节点限制。 在随后的部分中,将更详细地说明在压力测试过程中遇到的问题以及解决这些问题的方法。

如前所述,单个NVM的最大DIMM容量高于DIMM,这意味着与DRAM相比,相同DIMM容量的成本更低。 使用NVM来弥补不足的内存容量,可以大大减小Tair MDB容量群集的大小。 考虑设备成本,电费和机架成本,总体成本可降低30%到50%。

行动中的原则:实施NVM的指南

Tair MDB在使用支持PMem的文件系统安装(DAX安装)时将NVM用作块设备。 分配NVM空间时,第一步是在相应的文件系统路径中创建并打开文件,并使用posix_fallocate分配空间。

首先考虑:内存分配器

NVM本质上是非易失性的。 缓存服务Tair MDB将NVM识别为易失性设备,而无需考虑原子性和崩溃后恢复,也无需显式调用诸如clflush / clwb之类的命令来将CPU缓存内容强制刷新回介质。

使用DRAM空间时,诸如tcmalloc / jemalloc之类的内存分配器是可选的。 NVM空间将文件(或字符设备)公开到上层,因此首先要考虑的是如何使用内存分配器。 开源程序pmem [1]保护易失性内存管理库libmemkind,以及类似于malloc / free的易于使用的API。 在大多数应用中切换时,此模式是一个不错的选择。

Tair MDB的实现未使用libmemkind [2]。 为了解释这一选择,下一节将介绍Tair MDB内存布局。

内存布局

Tair MDB使用slab机制进行内存管理,该机制不会在使用时动态分配匿名内存,而是在系统启动时分配大内存。 随后,内置的内存管理模块在该大内存块中连续分配元数据和数据页,如下图所示:

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

·缓存元数据:这将存储元数据信息(例如最大碎片数)和Slab Manager的索引信息。

·Slab Manager:每个Slab Manager管理一个固定大小的Slab。

·Hashmap:全局哈希表的索引,该索引使用线性冲突链处理哈希冲突,并且所有对键的访问均由Hashmap处理。

·页面池:页面池在启动时将内存分为多个页面,每个页面的大小为1M。 Slab Manager从页面池中请求页面,并将其格式化为指定大小的Slab。

在启动时,Tair MDB将初始化所有可用内存。 因此,后续的数据存储部分不再需要从操作系统动态分配内存。

使用NVM时,有必要将对应的文件映射到内存以获得虚拟地址空间。 然后,内置内存管理模块可以透明方式使用此空间。 因此,在此过程中,无需再次调用malloc / free来管理NVM上的空间。

压力测试开始:暴露的问题

部署NVM后,使用100个字节的条目对Tair MDB进行压力测试,产生以下数据:

引擎查看的延迟:

客户查看了QPS:

从这些图表可以看出,基于NVM的读取QPS延迟与DRAM大致相同,而其写入TPS延迟则约为DRAM的三分之一。

分析

性能结果表明所有写入性能损失都发生在锁上。 该锁管理的关键部分包括先前指定的内存布局中提到的页面写入操作。 在这种情况下,可能的原因是与DRAM相比,NVM上的写入延迟更高。

在压力测试期间,使用pcm [3]查看NVM DIMMS的带宽统计信息,显示在一个DIMM上的写入高度不平衡。 在稳定状态下,此DIMM上的写入比其他DIMM上的写入大两倍。

下图说明了以上内容:

在进一步探讨这些细节之前,以下部分将概述用于NVM的DIMM放置策略。

DIMM放置策略

单个插座按以下分布布置了四个NVM DIMM:

这种放置策略称为2–2-1。 每个插槽附带4个DIMM,分别属于四个不同的通道。 使用多个通道时,CPU交错以更有效地使用内存带宽。 在当前的放置策略和配置中,CPU的单位为4K,并按DIMM顺序交错。

诊断热点:不平衡的原因

从内存交错策略可以推断出,所有写入操作均在不平衡DIMM上的单个区域中完成,从而使该DIMM保留的写入次数明显多于其他DIMM。

在这种情况下,下一个任务是确定导致写入热点的处理逻辑。 一种简单的方法是找到可疑点并一一排除。 下一节描述了Tair团队用来确定处理逻辑的方法。

优化开始:定位热点

如上所述,写入热点会导致NVM DIMM访问不平衡。 因此,优化的第一步是查找并处理写入热点,例如通过分散热点访问或将访问热点放入DRAM。

Tair小组使用Pin查找热点[4]。 前述的Tair MDB通过对文件执行mmap来获得用于操作存储器的逻辑地址。 因此,Pin可用于获取mmap的返回值,并进一步在程序存储空间中获取NVM的逻辑地址。 然后,团队继续使用Pin对所有操作存储器的编程指令进行存根,并计算从NVM映射到地址空间的每个字节的写入次数。

最后,确认存在写入热点,并将其相应区域建立为页面的元数据。 该团队考虑了几种解决写入热点问题的方法,包括为每个DIMM添加填充和交错热点,按DIMM将基本相似的热点数据按组存储,以及将热点移回DRAM。 团队的最终决定是将slab_manager和page_info移回DRAM。 修改后的结构如下:

做出这些更改后,不平衡问题得到了有效解决,TPS从85w增加到140w,同时将引擎内写入延迟从40us减少到12us。

解决过多的锁开销

当TPS为140w时,上述pthread_spin_lock的开销仍然很高。 性能记录结果表明pthread_spin_lock使用了此调用堆栈:

对batch_alloc_item的分析显示,初始化页面中的项目可能会向NVM中写入大量内容。 这是浪费大量时间的地方,因为写入NVM的速度比写入DRAM的速度慢。

根据Tair MDB的逻辑,仅在将页面链接到slab_manager时才需要锁定。 因此,可以将对项目的初始化操作移出关键部分。 发现之后,将筛选并优化Tair MDB代码中所有写入NVM的操作。

经过优化后,pthread_spin_lock的开销下降到正常范围,TPS增加到170w,而引擎内延迟为9us。

优化结果

平衡的写入和锁定粒度优化,以及其他优化工作,有效地减少了延迟并将TPS增加到170w,比以前的数据增长了100%。 介质的差异仍然比DRAM的写入性能低30%。 但是,由于缓存服务具有比写入更多的读取功能,因此这种不足不会显着影响整体性能。

引导调查结果:新的设计指南

根据他们的优化工作和生产环境试验,Tair团队能够确定一组三个关键设计规则,以实施基于NVM的缓存服务。 这些规则与特定的NVM硬件功能密切相关,这极大地影响了缓存服务的构建。 具体而言,与DRAM相比,NVM密度更高,价格更低,并且具有更高的延迟和更小的带宽。 与读写延迟相比,它还会带来读写问题,并且读写延迟更高,当在同一位置重复进行写入时,容易出现快速磨损。

第一条规则:避免写热点

在实施NVM之后,Tair MDB遇到了写入热点问题,其中写入热点加剧了介质磨损并导致负载状况失衡。 在优化之前,写入压力正好落在一个DIMM上,反映出无法充分利用整个DIMM带宽。 除了内存布局(具有元数据和数据的混合存储功能)之外,来自事务的访问还可能导致写入热点。

Tair团队避免写入热点的方法包括:

·通过将元数据和数据移入DRAM来分离元数据和数据。 元数据比数据更常被访问。 元数据的一个示例是上述Tair MDB的page_info。 这使得NVM较高的写入延迟(与DRAM相比)减少了上层的缺点。

·在上层应用实现写时复制的逻辑。 在某些情况下,这可以减少指定区域的硬件磨损。 在Tair MDB中对数据条目的更新不会就地更新前一个条目,而是在哈希映射冲突链的开头添加一个新条目。 这样的先前条目将被异步删除。

·定期检查写入热点,并动态迁移到DRAM进行合并。 对于由于访问上述事务而导致的写入热点,Tair MDB会定期检查并合并写入热点,以限制对低层介质的访问。

第二条规则:减少对关键部分的访问

NVM具有比DRAM高的写入延迟。 因此,当关键部分包括对NVM的操作时,由于来自关键部分的放大影响,上层的并发度降低。

在DRAM上运行Tair MDB时,不会出现前面提到的具有锁定开销的问题,因为在DRAM上运行会自动假定此关键部分的开销很小。 但是,使用NVM时,此假设变得不正确。

使用新介质的一个常见问题是,在以前的软件过程中有效的假设可能不再适用于新介质,因此必须转而考虑这一点。 在这种情况下,Tair团队建议在缓存服务中使用NVM时,尽可能采用无锁设计(基于数据存储)。 这限制了对关键部分的访问,并避免了由更高的延迟导致的级联连接效应。

Tair MDB通过引入用户空间RCU使访问路径上的大多数操作都无锁定,这大大减少了NVM延迟对上层的影响。

第三条规则:实现适当的分配器

分配器是使用NVM进行事务处理的基本组件。 分配器的并发性直接影响软件的效率,分配器的空间管理决定了空间利用率。 设计和实现适合于特定软件上下文的分配器对于使用NVM缓存服务至关重要。

Tair MDB研究表明,适合与NVM一起使用的分配器必须提供以下功能:

·碎片整理:NVM密集且容量大。 结果,在相同的碎片率下,NVM比DRAM浪费更多的空间。 分片整理机制的存在要求上层应用程序避免就地更新,并且分配器尽可能分配固定大小的空间。

·线程本地配额:类似于如上所述减少访问关键部分的情况,从全局资源池分配资源的延迟将减少分配操作的并发性,除非存在线程本地配额。

·容量意识:分配者需要解释他们管理的空间,并且缓存服务必须相应地扩展他们管理的空间。 因此,分配器必须具有相应的功能才能满足这些需求。

实验表明,以上设计规则在实际应用场景中既可行又有效,并且可以扩展到NVM实施可以证明是有益的其他产品。

期待

如前几节所述,Tair MDB仍然将NVM视为易失性设备,由于NVM的高密度和低价格,降低了服务的总体成本。 展望未来,Tair团队将寻求新的硬件和方法,以利用NVM的非易失性,实现交易和其他上层服务。

(傅秋雷付秋雷的原创文章)

如果您有兴趣为阿里巴巴在Tair上的工作做出贡献,该小组目前正在 阿里巴巴招聘页面上 欢迎参与的开发人员提出申请

参考文献:

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

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

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

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

[5] 未发现的技术! Tair分布式缓存系统,可处理双11上的数千亿次访问

[6]持久性存储器编程:生态系统的当前状态

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

[7]永久性记忆:即将完成的操作,预期的长期功能

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

阿里巴巴科技

关于阿里巴巴最新技术的第一手和深入信息→Facebook: “阿里巴巴技术” 。 Twitter: “阿里巴巴技术”

翻译自: https://hackernoon.com/going-on-a-tair-an-alibaba-guide-to-nvm-caching-optimization-97f799675a44

win10 固态nvm优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值