Disaggregating Persistent Memory and Controlling Them Remotely: An Exploration of Passive...——论文阅读

ATC 2020 Paper 论文阅读笔记整理

问题

将存储系统与计算服务分开管理,可以实现更好的可管理性和资源利用率,现有的分类存储系统多数使用硬盘或SSD作为存储介质。最近,持久内存(PM)技术已经成熟,分离式PM可以享受与传统分离式存储系统相同的好处,但由于其类似内存的性能和字节可寻址性,它需要新的设计。

在构建分离式PM系统时,有两种设计方向:

  • 传统分离式存储系统中采用的类型,在存储节点上运行管理软件,即在数据所在的位置主动管理数据,称为主动分解PM,或aDPM(图1b)。通过共享数据及其管理,aDPM可以为应用程序提供低延迟性能。然而,aDPM需要存储节点具有强大的处理能力,以维持高带宽网络并充分提供PM的卓越性能。

  • 将存储节点视为不执行任何数据处理或数据管理任务的被动方,称之为pDPM模型。pDPM提供了几个实际好处和研究价值:

    • pDPM降低了总拥有成本,PM节点(称之为数据节点或DN)可以是将整个CPU专用于其他应用程序的常规服务器,也可以是直接将NIC连接到PM的硬件设备。

    • pDPM避免了DN的处理能力成为可扩展性的瓶颈。

    • 探索pDPM系统将揭示各种性能、可扩展性和成本权衡,这可以帮助未来的研究人员和系统构建者做出更好的设计决策。

挑战

设计pDPM系统的关键问题是:无法在DN上执行数据和元数据操作。

  • 让客户端/计算节点(CN)通过单向网络通信直接访问DN来执行所有任务,称之为pDPM-Direct模型(图1c)。但由于CN不能有效地协调,当对同一数据进行并发读/写时,pDPM-Direct的性能和扩展性较差。

  • 使用中央服务器(协调器)来管理DN,协调从CN到DN的所有访问,称为pDPM-Central(图1d)。但在CN和DN之间增加了更多的跳数,而协调器是一个新的可扩展性瓶颈。

本文方法

本文探索了从计算服务器远程管理分离式PM的设计,称为被动分离持久内存(pDPM)。与在存储服务器上管理PM的方案相比,pDPM显著降低了成本,并避免了存储服务器上的可扩展性瓶颈。

本文构建了Clover,具有pDPM新架构的键值存储系统(图1e)。主要思想是将数据和元数据的位置分开,使用不同的通信机制来访问,并采取不同的管理策略。数据存储在DN中,元数据存储在全局元数据服务器(MS)上。CN使用单向网络通信直接访问DN进行所有数据操作,使用双向通信网络访问MS,MS执行所有元数据和控制操作。

  • 数据平面设计来自日志结构写入和跳表,在没有高写争用的情况下实现了1或2 RTT的读/写性能,同时确保了并发写入的正确同步和崩溃一致性。

  • 将所有元数据和控制操作移出性能关键路径。完全消除了MS与DN的通信,在不访问DN的情况下执行空间管理和其他控制任务。

  • 支持复制写入,以实现高可用性和可靠性。

开源代码:GitHub - WukLab/pDPM: Passive Disaggregated Persistent Memory at USENIX ATC 2020.

通过对三种pDPM系统的广泛评估,Clover是性能最好的pDPM系统。在常见数据中心工作负载下的性能与非pDPM远程内存键值存储相似,同时将资本支出和运营支出分别降低了1.4倍和3.9倍。

pDPM 概述

被动分离式持久内存

对pDPM架构的定义包括两个概念:将PM与计算服务器分离到基于PM的存储池中,并消除这些分离的PM节点(DN)的处理需求。

pDPM挑战

pDPM提供了成本和可管理性优势,并使用RDMA等网络通信技术进行构建。但与传统的分布式存储和内存系统不同,DN只能远程访问和管理。

  • 在并发数据访问时提供良好的性能。因为DN缺乏处理能力,无法编排(序列化)并发访问。

  • pDPM存储系统仍应尽量减少网络RTT。

  • pDPM是一种持久存储系统,DN可以独立故障,需要确保崩溃恢复期间数据和元数据的一致性,并为高可用性和可靠性提供冗余。

系统接口和保证

  • 支持可变大小条目的键值存储,用户可以在其中创建、读取、写入和删除键值条目。

  • 不同的CN可以共享访问相同的数据。

  • 确保条目在并发读写器之间的原子性,成功写入表示数据条目已提交(原子性),读取仅查看已提交的值。

  • 支持跨DN的复制写入。

网络层

选择RDMA作为连接所有服务器和DN的网络技术,使用RDMA的RC(可靠连接)模式,支持单向RDMA操作,并确保无损和有序的数据包传输。

pDPM系统

直接连接

pDPM-Direct将CN直接连接到DN(图1c),CN使用单向RDMA操作执行对DN的直接访问。主要挑战是难以协调各种数据和元数据操作的CN。

为了避免频繁的空间分配(需要跨CN进行协调),为每个数据条目预先分配两个空间,一个用于存储读取的已提交数据(已提交空间),一个存储正在进行的新数据(未提交空间)。CN借助分布式共识协议分配这些空间,它们的位置在数据输入空闲时间之前不会改变。CN在本地存储所有元数据(已提交和未提交空间的位置),以避免将元数据读写到DN,以及在并发访问下确保元数据一致性的成本。

为了提升读性能,采用无锁、基于校验和的读取机制,该机制使读取只需要一个RTT。将CRC(错误检测码)校验和与DN处的每个键值条目相关联,通过RDMA从DN读取数据及其CRC,随后CN计算读取数据的CRC,并与读取的CRC进行比较。如果不匹配,则读取不完整(正在进行的写入过程中的中间状态),CN重试读取请求。虽然计算CRC会增加一些性能开销,但它比锁的方案低得多。流程如图2a。

pDPM-Direct仍需要锁进行写入。设计了基于RDMA的高效写锁,在每个数据条目的开头关联一个8字节的值作为其锁。为了获取锁,CN对值执行RDMA CAS(比较和交换)操作,比较该值是否为0,如果是0则将其设置为1,否则重试CAS操作。为了释放锁,CN执行RDMA写入并将值设置为0。

为了写入数据条目,CN首先计算CRC并将其附加到新的数据条目上,之后CN使用其本地元数据定位条目并锁定条目(一个RTT)。然后,CN将新数据(带CRC)写入未提交空间(一个RTT),如果发生崩溃,该空间将作为恢复期间使用的重做副本。之后,CN通过RDMA写入(一个RTT)将新数据写入提交空间。最后,CN释放锁(一个RTT)。总写入延迟为四个RTT加上CRC计算时间(无争用时),其中两个RTT包含数据。流程如图2a。

性能:pDPM-Direct在读取大小较小时提供了出色的读取性能,因为只需要一个无锁RTT,并且计算CRC很快。但写入性能差,由于高RTT和锁争用。由于并发写入期间的锁争用,其可扩展性也受到限制。此外,pDPM-Direct需要大量空间来存储数据和元数据,对于每个数据条目,需要存储两个数据副本,且所有CN都必须存储所有元数据。

通过协调员连接

pDPM-Central(图1d)使用中央协调器来协调所有数据访问,并执行元数据和管理操作。CN向协调器发送RPC请求,协调器向DN执行单向RDMA操作来处理这些请求。

为了实现高吞吐量,在协调器中使用多个RPC处理线程。图2b显示了pDPM-Central的读写协议。由于所有请求都经过协调器,可以作为并发访问数据条目的序列化点。在协调器上为每个数据条目使用本地读/写锁,以在多个协调器线程间同步。除了协调数据访问外,协调器还执行数据条目的空间分配和取消分配。协调器使用其本地PM持久存储数据条目的所有元数据。

为了执行读取,CN向协调器发送RPC读取请求。协调器使用其本地元数据找到条目的已提交数据的位置,获取条目的本地锁,使用单向RDMA读取从DN读取数据,释放其本地锁,最后回复CN的RPC请求。CN侧的端到端读取延迟(当没有争用时)是两个RTT,这两个RTT都涉及发送数据。

为了执行写入,协调器在DN处为新数据分配一个新空间,然后将数据写入其中。在写入过程中,不需要锁,因为这是对未向其他协调器RPC处理程序公开的位置的错位写入。写入后,协调器获取锁,用新数据的位置更新其本地元数据,并将此新位置刷新到其本地PM以防止碰撞,随后释放锁。没有争用的总写入延迟是两个RTT,都包含数据。

性能:与pDPM-Direct相比,pDPM-Central大大减少了写入RTT,在集群规模较小时具有良好的写入性能。pDPM-Central中的CN不需要存储任何元数据,但CN数量或DN数量增加时,协调器会成为性能瓶颈。pDPM-Central的读取性能比pDPM-Direct差,因为CN和协调器之间有额外的RTT。此外,协调器的CPU利用率很高,因为需要许多RPC处理程序线程来维持来自CN的并行请求。

Clover

为解决前两个pDPM系统的问题,提出了Clover(图1e)。Clover的主要思想是将数据平面和控制平面的位置、通信方法和管理策略分开。允许CN直接访问DN进行所有数据操作,并使用一个或几个元数据服务器(MS)进行控制平面操作。

为避免MS成为可扩展性的瓶颈,支持多个MS,每个MS服务于一个数据条目的分片。每个MS都将其负责的数据条目的元数据存储在其本地PM中。1 KB数据条目的元数据存储开销低于2%。CN缓存热数据条目的元数据,在内存压力下,CN使用替换策略驱逐元数据(支持FIFO和LRU)。

为提升Clover性能,采用以下方法:

  • 将所有元数据操作移出性能关键路径。

  • 使用无锁数据结构来提高可扩展性。

  • 采用优化机制来减少数据访问的网络往返。

  • 利用pDPM的独特原子数据访问保证。

数据平面

提出了新的机制来执行无锁、快速和可扩展的读写。允许DN中数据条目的多个提交版本,并将它们链接成链,对数据条目的每次提交写入都会将其最新版本移动到新位置。

为避免用新位置更新CN,使用自识别数据结构来查找最新版本。在每个版本的数据条目中都包含一个标头,包含一个指针和一些用于垃圾收集的元数据位。指针按照写入顺序将数据条目的所有版本链接在一起,NULL指针表示版本是最新的。CN在第一次访问数据条目时从MS获取链头的标头。然后,它在本地缓存标头,称为游标,以避免每次数据访问时访问MS的开销。

:Clover读是无锁的。为了读取数据条目,CN执行链式遍历,从CN游标指向的数据缓冲区版本开始。然后,它使用此获取的缓冲区中的指针读取下一个版本,直到读取NULL指针。链式遍历中的所有步骤都使用单侧RDMA读取。在链式遍历之后,CN更新其游标以指向最新版本。

当标头不是最新的时,链式遍历可能会很慢[68]。受跳表[53]的启发,使用快捷方式直接指向每个数据条目的最新版本或最近版本来解决这个问题。数据条目的快捷方式存储在DN,其位置在条目的生命周期内永远不会改变,MS存储所有快捷方式的位置。当CN首次访问数据条目时,它从MS检索其快捷方式的位置并将其缓存在本地。CN同时发布链式读取和快捷读取,当较快的一个完成时,它返回用户请求,并丢弃另一个结果。不会用快捷方式读取完全取代链式遍历,因为快捷方式在后台异步更新,可能不如游标更新快。

:Clover不覆盖现有的数据条目,并在将新数据链接到条目的链之前执行无锁、错位写入。写入数据条目时,CN首先选择MS预分配的空闲DN空间。通过单侧RDMA写入,将新数据写入缓冲区。之后,CN执行RDMA CAS操作,将新数据链接到条目版本链的尾部,替换标头指针。

之后,CN异步使用单侧RDMA写入来更新条目的快捷方式,以指向新的数据版本。CN还将游标更新到新编写的版本。Clover的链式结构和写机制确保了写者不会阻挡读者,读者也不会阻挡写者。它们还确保读者只能查看已提交的数据。如果不对同一数据条目进行高写入争用,一次写入只需要两个RTT。

回收:写入提交后,CN可以停用旧版本的数据条目,并回收缓冲区空间。为了提高性能并最大限度地减少与MS通信的需要,CN在后台向MS发送异步、批处理的回收请求。进一步避免了MS使用超时和基于纪元的垃圾收集的组合来使CN缓存元数据无效的需要。

控制平面

CN使用双边操作与MS通信执行所有元数据操作。

空间分配:由于Clover异地写入,对DN空间分配有很高的要求。使用一种高效的空间分配机制,MS将所有DN的空间打包成块。每个块都承载相同大小的数据缓冲区,不同的块可以具有不同的数据大小。每个CN一次从MS请求多个空间,将空间分配从性能的关键路径上移除。

垃圾收集:Clover的只追加链式数据结构使其写入速度非常快,但需要垃圾收集(GC)旧数据。设计了一种新的高效GC机制,不涉及任何数据移动或与DN的通信,同时最大限度地减少了MS和CN之间的通信。

GC的基本流程很简单,MS将回收的空间放入自由列表(FreeList)来处理CN的回收请求。当CN请求更多可用缓冲区时,会从FreeList中获取可用空间。只要大小合适,任何CN都可以使用自由空间进行新写入。同时需要解决以下3个问题:

  • 为了获得良好的GC性能,应该避免在回收缓冲区后使CN缓存游标无效,以减少MS和CN之间的网络流量,但CN过时的游标可能会导致链式遍历失败。使用两种技术来解决这个问题:(1)MS在回收数据缓冲区后不会清除其标头(或内容);(2)为每个数据缓冲区分配一个GC版本,MS在回收数据缓冲区后增加GC版本。当缓冲区作为空闲空间分配给CN时,它给出GC版本以及缓冲区的位置。在CN使用该空间进行新写入之前,DN处的此空间的内容包含旧数据和旧GC版本,CN使用该空间进行写入后,它将包含新数据和新GC版本。对于游标指向此缓冲区的CN需要区分这两种情况。CN将缓存游标中的GC版本与从DN中读取的GC版本进行比较,来判断缓冲区是否包含其预期数据。如果不匹配,CN将丢弃读取的数据并使其缓存的游标无效。

  • 保证读取隔离和原子性(读取器读取与其元数据标头一致的数据)。如果对数据缓冲区的读取需要很长时间,并且在读取时间内,该缓冲区已被MS回收,并作为新缓冲区分配给其他CN,并执行写入,则可能会发生不一致的读取。使用类似于FaRM[15]的读取超时方案来防止这种不一致的情况。在两个RTT后中止读取操作,因为在有问题时,上述步骤至少需要两个RTTs(一个用于CN向MS提交回收请求,一个用于MS将空间分配给新的CN)。

  • GC版本溢出。只能在数据缓冲区的标头中为GC版本使用有限数量的位(8位),因为标头需要小于原子RDMA操作的大小。当GC版本超过最大值时,必须从零重新开始。目前的GC机制中,CN无法判断缓冲区是否与其缓存的游标版本匹配,或者是否已经前进了28=256个版本。为此,使用了基于纪元的超时机制。当MS发现GC版本的数据缓冲区溢出时,它将回收的缓冲区放入OvflowList中,并在将其移动到FreeList之前等待T(可配置的时间)。所有CN在T的非活动期后都会使自己的游标无效(如果在此期间,CN访问缓冲区,则已提前更新了游标)。为了同步历元时间,MS在T之后向CN发送消息。纪元消息是GC期间MS与CN之间的唯一通信。

故障处理

DN可以独立于CN失败,Clover需要处理DN的瞬时和永久故障。对于前者,Clover保证DN可以在重新启动后恢复其所有提交的数据(即崩溃一致)。对于后者,我们在Clover中添加了跨多个DN的数据复制支持。此外,Clover还处理MS的故障。

从瞬态故障中恢复:如果DN在CN成功将其写入的新数据链接到链之前失败(表示未提交的写入),CN只需将空间视为未使用,即可丢弃新的写入。

数据冗余:由于用户指定的复制程度为N,Clover保证在N-1个DN失败后数据仍然可以访问。提出了为Clover数据结构设计的原子复制机制。基本思想是将数据条目DN的每个版本链接到下一个版本的所有副本。图4显示了复制数据条目的示例(复制程度为2)。通过全链接方法,只要数据条目中每个版本的一个副本存在,Clover就可以构建一个有效的链。

每个数据输入版本都有一个主副本和一个或多个辅助副本。要将新版本DN+1写入当前尾部为DN且具有R个副本的数据条目,CN首先将新数据写入R个DN。CN并行对DN的主副本的头部中的位执行单侧CAS,以测试条目是否已经处于复制写入的中间。如果没有,则设置该位,表示该条目现在处于复制写入状态。所有写入和CAS操作都是并行发送的,以尽量减少延迟。在CN收到所有操作的RDMA确认后,它构造了一个包含指向DN+1副本的R指针的标头,并将其写入DN的所有副本。一旦将新标头写入DN的所有副本,系统就可以从崩溃中恢复DN+1(最多R−1并发DN故障)。

MS冗余:MS管理几种类型的元数据。唯一无法重建的元数据类型是键(键值条目)以及从键到DN中数据条目的位置的映射。为了避免MS成为单点故障,实现了一个或多个备份MS。在创建(删除)新的键值数据条目时,主MS同步复制(删除)密钥和价值链的头部到所有备份MS。MS通过读取DN中的值链来重建所有其他元数据。

负载均衡

使用两级方法来平衡Clover中的负载:在衡MS上全局平衡负载,在每个CN上本地平衡负载。全局管理利用了Clover的两个功能:(1)MS是将所有新空间分配给CN的一方,(2)Clover中同一条目的数据版本可以放置在不同的DN上。为了减少DN的负载,MS在分配时从其他DN向CN分配更多可用空间。每个CN在运行时内部平衡不同DN的负载。每个CN为每个DN保留一个桶来存储可用空间。它根据自己的负载平衡需求,从不同的存储桶中选择可用空间进行新的写入。

讨论

Clover的设计有四个好处。

  • Clover在pDPM系统中表现最佳,无论在有争用还是无争用的情况下,它在读取和写入方面都优于pDPM-Direct和pDPM-Central。因为以下四种方法实现这一目标:(1)确保数据路径不涉及MS,(2)减少与MS的元数据通信并将其移出性能关键路径,(3)确保整个数据路径中没有内存复制,(4)利用pDPM的独特优势执行RDMA原子操作。

  • Clover可以很好地适应CN和DN的数量,因为读写都是无锁的。读者不会屏蔽写者或其他读者,写者也不会屏蔽读者。同一条目的并发写者只在RDMA CAS操作的短时间内竞争。Clover还最大限度地减少了MS的网络流量和MS的处理负载,这使MS能够很好地扩展CN的数量和数据操作量。

  • 完全避免了GC期间MS和DN之间的数据移动和通信。为了用较少的MS扩展和支持许多CN,还避免了CN无效消息。MS也不需要主动向CN发送任何其他消息,而是CN从MS获取信息。此外,MS采用了线程模型,该模型自适应地让工作线程休眠,以降低MS的CPU利用率。

  • Clover数据结构灵活,可以很好地支持负载平衡。不同版本的数据条目不需要位于同一DN上,这种灵活的放置是Clover负载平衡和数据复制需求的关键。

局限性:Clover中的每次写入都需要两个RTT,在激烈的争用下,其写入性能会下降。但大多数数据中心工作负载读取较多[7],在常见情况下,Clover提供了出色的性能。

实验

实验环境:14台机器,每台机器配备两个Intel Xeon E52620 2.40GHz CPU、128 GB DRAM、一个100 Gbps Mellanox ConnectX-4 NIC,通过100 Gbps Mellanox InfiniBand交换机连接。

数据集:Micro-benchmark、YCSB

实验对比:读写延迟、吞吐量、CPU时间、

实验参数:请求大小、不同数据集、CN数量、DN数量、缓存大小

总结

针对基于PM的分离式内存系统,现有KV存储设计不适合新系统架构。本文提出Clover,数据存储在DN中,元数据存储在MS中,CN使用单向RDMA访问DN进行数据操作,使用双向RDMA访问MS,MS执行元数据和控制操作。包括3个技术:(1)设计无锁、异地更新的数据平面,在没有高写争用的情况下实现了1/2 RTT的读/写性能,利用地址缓存加快查找速度。(2)将元数据和控制操作移出关键路径,完全消除MS与DN的通信,在不访问DN的情况下执行空间管理和GC。(3)通过链表支持多份冗余数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙BOOK言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值