最后更新:2020-05-14 11:02:14 手机定位技术交流文章
作者|张凯,SmartX联合创始人兼首席技术官.
两年前,我们发表了一篇题为《2018年存储技术热点和趋势总结》的文章,引起了许多朋友的关注。两年过去了,存储行业在不断变化。今天,我们将根据近两年来学术界和工业界的进展,做一个总结,供大家参考。
这篇文章将涵盖持久记忆、共识、一致性,
永久存储器
PMem在2018年仅限于学术讨论,但现在它已经进入工业领域。2019年4月,英特尔发布了首个英特尔Optane DC永久存储器(内部产品代码Apache Pass),这可以说是一个划时代的事件。如果你根本没有听说过PMem,你可以通过我以前的文章了解它。
让我们先看一看外表。

是的,内存连接器看起来像内存。所以很多人把Optane PMem和Optane SSD混为一谈,因为它们都被称为Optane。事实上,Optane固态硬盘是NVMe接口,采用PCIe总线。由于接口和总线不同,Optane PMem和Optane固态硬盘的使用方式完全不同。
目前,单个条的容量有三种选择(因为它看起来像内存,所以单词“bar”用作量词):128G、256G和512G,它们仍然相当昂贵。
我想在这里强调的是,PMem不是一个更慢的内存或更快的固态硬盘。PMem是PMem,它有许多自己的特点。为了更好地使用PMem,我们需要更多地了解PMem。
首先,由于PMem是一个内存接口,数据可以通过中央处理器指令直接访问。读取PMem时,与读取公共内存地址没有区别。中央处理器缓存将进行数据缓存。所有与内存相关的知识,如缓存线优化、内存顺序等。,在此适用。写作更加复杂。除了理解与内存相关的特性,还需要理解一个重要的概念:掉电保护域。这是因为,尽管PMem设备本身是非易失性的,但由于存在中央处理器高速缓存和内存控制器,而且PMem设备本身也有高速缓存,因此当设备断电时,传输中的数据仍然会丢失。

对于电源故障保护,英特尔提出了异步动态随机存取存储器刷新(ADR)的概念,该概念负责在电源故障发生时将数据写入动态随机存取存储器,以确保数据的持久性。目前,自抗扰控制器只能保护内存中写等待队列(WPQ)和内存管理模块(PMem)缓存中的数据,而不能保护内存中的数据。在下一代英特尔产品中,将引入增强型自抗扰控制器(eADR),以进一步保护中央处理器高速缓存中的数据。
由于ADR概念的存在,一条简单的MOV指令不能保证数据的持久性,因为数据很可能在指令结束时保留在中央处理器高速缓存中。为了确保数据的持久性,我们必须调用CLFLUSH指令,以确保中央处理器高速缓存行中的数据被写回到PMem。
然而,CLFLUSH不是为PMem设计的。CLFLUSH指令一次只能刷新一个缓存行,并且只能串行执行,因此执行效率非常低。为了解决CLFLUSH效率低下的问题,英特尔发布了新指令CLFLUSHOPT,字面意思是CLFLUSH的优化版本。与CLFLUSH相比,多个CLFLUSHOPT指令可以同时执行。缓存行刷新的效率可以大大提高。当然,CLFLUSHOPT后面需要跟一个SFENCE指令,以确保刷新执行完成。
对应于CLFLUSHOT的是CLWB指令。CLWB和CLFLUSHOT的区别在于,在执行CLWB指令后,数据保留在中央处理器高速缓存中。如果再次访问数据,可以保证缓存命中,而CLFLUSHOT则相反。指令执行后,数据不会存储在中央处理器高速缓存中。
此外,在写入数据时,非临时存储(NTSTORE)指令(这是在SSE2中添加的指令,不是专家提醒后的新指令)可以绕过中央处理器高速缓存,因此不需要额外的刷新操作。NTSTORE之后还会有一条SFENCE指令,以确保数据能够真正到达持久区域。
看起来很复杂,对吧?这只是一个介绍。在PMem上编写程序相当复杂。英特尔最近出版了一本名为《编程持久内存》的书,专门介绍了如何在PMem上编程。它有400多页,感兴趣的合作伙伴可以阅读。
为了简化使用PMem的复杂性,英特尔建立了PMDK项目,提供了大量打包的接口和数据结构,我在此不再赘述。
自PMem发布以来,许多组织都测试了它的实际性能,因为毕竟之前每个人都用内存来模拟PMem,而得到的实验结果并不准确。其中,UCSD出版的《英特尔光电DC持久存储模块基本性能指标》更具代表性。本文帮助我们总结了23个观察结果,其中更重要的几点如下:
随机Optane DC存储器加载的读延迟是305 ns。这个延迟比本地DRAMOptane慢大约3倍。当以顺序模式访问时,DC存储器延迟明显更大(2倍)。该结果表明,Optane DC PMMs将相邻的请求合并成一个256字节的附件。六个交织的Optane DC PMMs的最大读取带宽为39.4 GB/秒,最大写入带宽为13.9 GB/秒。这个实验利用了我们的六个交错的Optane DC PMMs,所以访问是分散在设备上的。坦DC读规模与线程数;而写入则不然。Optane DC内存带宽随线程数而扩展,最大吞吐量可达17个线程。然而,四个线程足以饱和Optane DC存储器写带宽应用级Optane DC带宽受访问大小的影响。为了充分利用李泽的Optane DC设备带宽,最好是256字节或更大的访问。因为DC比动态随机存取存储器更受访问模式的影响。Optane DC内存易受读写混合工作负载的影响。当以顺序模式访问时,坦DC带宽要高得多(4倍)。这个结果表明,Optane DC项目管理系统包含对合并逻辑的访问,以合并重叠的内存请求。如果你正在为项目管理系统开发一个程序,你必须仔细理解它。
当然,PMem有许多优点,如低延迟、高峰值带宽和字节访问。没什么好说的。毕竟,这是一个内存接口,价格是有的。
在这里,我想提几个可能在许多测试报告中没有提到的PMem坑,但我们亲自体验过它们,供您参考:
尽管峰值带宽很高,但单线程吞吐率很低,甚至远远低于通过SPDK访问NVMe设备的速率。例如,英特尔发布了一份报告,称在SPDK,一条单线程可以实现1000万IOPS,块大小为4KB。然而,根据我们的测试结果,在PMem上,当块大小为4KB时,单个线程只能实现100万IOPS。这是因为目前PMDK使用同步访问数据,所有内存拷贝都由CPU完成,导致CPU成为性能瓶颈。为了解决这个问题,我们使用了DMA进行访问,大大提高了单线程访问的效率。我们将在以后的另一篇文章中解释这些信息。
另一个问题是,当跨NUMA节点访问时,效率会受到很大影响。在我们的测试中,我们发现单个线程仅提供小于1GB/s的带宽用于跨NUMA节点的访问。因此,必须注意确保数据访问是本地的。
PMem有许多场景,例如:
作为容量更大、价格更低的主存储器,PMem在这种情况下并不适用。也有两种模式:操作系统不知道,硬件负责将动态随机存取存储器作为高速缓存,主存储器作为操作系统知道的主存储器,主存储器作为一个独立的仅存储NUMA节点,它目前由Linux内核支持,补丁作为真正的主存储器,提供可持续的存储容量。将来我们会有关于PMem其他部分的特别文章。
顺便说一句,剧透,将于今年上半年发布的SMTX ZBS 4.5版本包括了许多PMem的优化工作。与前一版本相比,总延迟可减少80%以上
分布式共识和一致性
在过去的十年里,分布式共识得到了彻底的研究。目前,各种Paxos和Raft的实现已经广泛应用于各种生产环境,各种细节的优化也相继出现。
如果你想系统地学习分布式共识,建议你阅读剑桥女博士海蒂·霍华德的毕业论文《分布式共识修正》。这篇论文可以说是对过去几十年中每个人在分布式共识方面所做工作的一个大而完整的总结。通过总结前人的工作,编译了一个分布式一致性模型,并逐一调整模型中的约束,从而遍历几乎所有可能的优化算法。可以说,该模型是一个熟练的工人,非常适合作为分布式共识的介绍。
谈到分布式共识,一致性是不可或缺的。分布式一致性是实现强一致性的一种非常经典的方法,但它不是唯一的方法。
分布式共识只是一种手段,强一致性是目的。
有许多方法可以实现强一致性。在过去的一段时间里,我认为最经典的是亚马逊的极光。
亚马逊极光目前已经发表了两篇文章。第一个是2017年在SIGMOD上发布的“亚马逊极光:高吞吐量云的设计考虑——国家数据库”。另一篇是2018年在SIGMOD上发表的论文《亚马逊极光:关于避免对输入/操作系统、提交和成员变更的分布式共识》。第二篇论文主要讲述了他们如何在不使用分布式一致性的情况下实现强一致性的效果。
为了介绍奥罗拉,让我们先简单看一下正常分布的一致性是如何实现强一致性的。

让我们假设计算端的当前状态是S0。这时,我们收到了一个请求,要求将该州改为S1。为了完成这一更改,存储端将启动分布式共识。如果成功,计算终端将状态改变为S1;如果失败,状态保持在S0不变。可以看出,存储端返回给计算端的状态只有成功和失败,但实际上存储端内部会有更多的状态,例如,5个节点中有3个成功,1个失败,1个超时。然而,这些状态被存储端屏蔽,并且不被计算端感知。这导致计算端必须等待存储端完成分布式一致性,然后才能继续前进。在正常情况下,不会有问题,但是一旦存储端异常,计算端必须等待存储端完成领导人选举或成员变更,从而导致整个计算端被阻塞。
奥罗拉打破了障碍。奥罗拉的计算端可以直接向存储端发送写请求,而不需要存储端节点之间达成任何共识。
一个典型的Aurora实例由分布在3个AZ中的6个存储节点组成。每个存储节点都维护一个日志列表和一个分段完成LSN(SCL),这是一个已被持久化的LSN。存储节点将向计算节点报告SCL。计算节点将在6个节点中找出4个最大的SCL,并将最小值作为保护组完整LSN (PGCL)。PGCL是已达到一致性点的Aurora实例。

它看起来像多重和平吗?是的,但奥罗拉不要求存储节点达成任何共识。如果出现故障,存储节点不需要参与领导者选举,也不需要等待所有日志复制完成。这意味着计算节点基本上不会被阻塞。
奥罗拉的微妙之处在于将分布式一致性从只负责存储的存储节点中分离出来,而一致性是由计算节点完成的。这又像太平洋吗?是的,我认为奥罗拉和太平洋在整体思维上非常相似。我个人认为,共识和存储节点之间的脱钩将是未来的趋势。
除了奥罗拉之外,雷姆齐的2020年FAST最佳论文:“具有一致性感知可持续性的强大而高效的一致性”也是一篇有趣的文章,我认为。
一般来说,当我们考虑一致性时,我们会把它和耐久性一起考虑。如果需要强一致性,仲裁写入将通过分布式一致性或其他复制方法来完成,这将在牺牲低性能的同时确保强一致性和持久性。如果只需要弱一致性,则不需要立即完成仲裁写入,只需要一个拷贝,然后异步完成数据同步。这将具有良好的性能,但由于缺少法定写入,持久性和一致性将会丢失。因此,强一致性有差的性能,弱一致性有好的性能,这一直是一个共识。
有没有办法既保证高一致性又保证高性能?雷姆齐在本文中提出了“一致性感知耐久性”的方法,将一致性和耐久性分开,放弃部分耐久性,以保证强一致性和高性能。实现方法可以用一句话来概括,即读取时复制。
在强一致性中,有一个非常重要的要求,即单调读取永远不会在读取新版本的数据后读取旧版本的数据。但是从另一个角度来看,如果没有读取发生,就没有单调读取,也没有必要做任何工作来确保一致性(这有点像薛定谔的猫吗?).

在我们写作的时候,我们做复制完全是为了确保可持续性,顺便说一句,也是为了确保一致性。如果我们可以牺牲持久性,那么在写入时,我们根本不需要进行复制,只需写入一个拷贝。我们只需要在需要一致性时(即读取时)(即复制时)完成一致性操作。所以我称这种方法为读时复制。
如果您的应用程序写得更多,读得更少,那么这种方法可以避免大量无用的复制操作,并且只在必要时(即读取时)执行复制。这确保了高一致性和高性能。我真的不得不佩服伦齐对一致性、连贯性和持久性的深入研究。
可能是系统的学生发现牺牲耐用性是不可接受的。然而,在像互联网应用程序这样的场景中,一些临时数据的持久性实际上并不十分重要,而一致性是影响体验的核心因素。让我们以出租车为例。如果您在开始时看到驱动程序离您的位置有1公里远,然后突然变成3公里远,则很可能在后台NoSQL数据库中发生了故障转移,并且存储在节点中的数据是旧数据,从而导致单调读取的破坏。但是,没有必要保证驾驶员位置数据的持久性。在这种情况下,以相对较小的成本确保单调读取将极大地改善用户体验。你会发现司机和你之间的距离越来越近,而不是越来越近。
此外,我还想向你们推荐另外两篇论文,其中一篇是《探索实用快速复制的共性》一书的作者约翰·斯特劳胡特的新作。另一种是使用raft实现erasurecode“craft:一种支持erasure code的Raft版本,用于降低存储成本和网络成本。”感兴趣的学生可以自己去看。我不会在这里介绍它。
分布式共享内存和异构计算

在我们开始之前,让我们先回顾一下计算机的发展历史。到目前为止,主流计算机是在冯·诺依曼的架构下开发的,所有的设计都以中央处理器和内存为中心。当CPU和内存容量不足时,它们的容量会通过总线不断扩展,如磁盘、GPU等。随着中央处理器速度不断升级,总线速度也不断升级以匹配中央处理器操作速度。同时,为了安全、高效地完成中央处理器与外围设备之间的通信,产生了DMA和IOMMU等技术。然而,公共汽车受到物理条件的限制,只能在很短的距离内通信。所有CPU可以直接访问的设备都需要集成在主板上,这是我们今天看到的主机。
当早期中央处理器的处理能力仍然很弱时,单个中央处理器不能胜任大规模计算任务。当时,有两个发展学派。一个是共享内存,这是为了在一台机器上增加中央处理器的数量。所有处理器共享相同的内存地址空;另一种是分布式内存,也可以理解为多台机器。每台机器的中央处理器有独立的内存和独立的地址空,程序通过消息传递相互通信。共享内存技术要求硬件要求高,处理器之间需要高速缓存一致性,而软件更改相对容易。早期的典型代表是大型机,也就是通常所说的大型机。分布式内存需要较少的硬件,但是软件需要以消息传递的方式重写。例如,早期的MPI程序主要用于高性能计算。由于大型机的高硬件成本,MPI逐渐成为主流。

在上世纪八九十年代,分布式共享内存(DSM)技术非常流行,即分布式共享内存。DSM通过操作系统的内存管理系统连接每个独立服务器上的内存地址,形成一个连续的内存地址,使应用程序更容易共享数据。然而,需求侧管理技术还没有发展起来,主要是由于当时CPU频率的增加和网络速度的不匹配,导致需求侧管理通信成本高,无法推广。

2000年后,CPU的发展逐渐遇到瓶颈,单核计算的性能不再可能有大的突破,CPU逐渐转向多核发展,个人电脑也采用共享内存技术。然而,随着大数据对计算能力和存储容量的需求,分布式存储技术得到了越来越广泛的应用,如MapReduce和Spark。
近年来,CPU速度仍未取得任何明显突破,但网络速度正在发生翻天覆地的变化。包括以太网和以太网可以达到200千兆带宽和美国级延迟(据说目前正在制定800千兆技术标准),RDMA技术的普及使得需求侧管理技术再次被大家提及。
OSDI的18篇最佳论文《乐高:硬件资源分解的非独立分布式操作系统》是一个需求侧管理系统,但除了中央处理器和内存,乐高还包括存储的讨论。在论文中,作者将中央处理器、存储器和存储器分别抽象为组件、微组件和组件,这些设备通过RDMA网络连接在一起。LegoOS为用户提供了虚拟节点的概念,每个虚拟节点类似于一个虚拟机,可以包含一个或多个组件、组件和组件。每个组件还可以同时服务多个虚拟节点。乐高公司将负责隔离资源。由于统一的内存地址空和POSIX接口兼容性,应用程序可以在LegoOS上运行,而无需重写。
乐高是一个非常好的主意,但是我认为它在实施中会面临巨大的挑战。一方面,由于大部分功能需要通过软件来实现,延迟可能会受到一定程度的影响。另一方面,乐高不使用缓存一致性模型,而是使用消息传递在不同组件之间进行通信。消息传递可能是一个更优雅的设计方案,但是如果你真的想在工业中实现乐高的想法,硬件制造商需要根据消息传递重新设计驱动程序,这对于现有的硬件生态来说可能是难以接受的。
在行业内,虽然到目前为止还没有成功的需求侧管理案例,但一些相关的技术已经开始出现。这里我们将重点讨论总线技术。
近年来,异构计算变得越来越普遍。中央处理器通过PCIe总线与GPU和FPGA等异构计算单元进行通信。由于PCIe总线诞生较早,不支持缓存一致性,这给编写异构计算应用程序带来了很大的复杂性。例如,如果一个应用程序想要在中央处理器和图形处理器之间,或者在图形处理器和图形处理器之间共享数据,它必须处理可能出现的缓存一致性问题。
为了适应日益增长的异构计算场景,各种制造商正计划引入新的总线技术,包括:
英特尔的计算快速链接(CXL)、IBM的一致性加速器接口(CAPI)、Xilinx的加速器高速缓存一致性互连(CCIX)、NVIDIA的AMD Infinity结构NVLink也不例外。来自不同制造商的技术为高速缓存一致性提供支持,这正是PCIe总线所缺乏的,也是行业所需要的。目前,下一代总线的竞争仍在进行中,但可能最后笑到最后的是英特尔支持的CXL。
在这里,我们只对CXL做一个简单的介绍。

CXL协议中定义了三个子协议:
Http://CXL。不提供对高速缓存一致性的输入输出访问,类似于当前的PCIe协议。高速缓存:用于设备对主存储器的访问。存储器:用于中央处理器对设备存储器的访问。例如,对于一个图形处理器设备,图形处理器到中央处理器和图形处理器到图形处理器的数据交换可以通过CXL实现。由于CXL支持缓存一致性,这个过程将变得非常简单,这无疑是一个重大的变化。对于存储设备,CXL使PMem能够通过CXL内存与中央处理器通信,无论它是永久内存还是易失性内存。这意味着PMem将来不仅能提供与当前NVMe设备类似的热插拔功能,而且还能摆脱内存总线对散热和功耗的限制。此外,未来可能会出现基于结构的CXL技术,并且中央处理器可以通过CXL协议访问远程内存。
CXL 1.0将采用与PCIe第五代兼容的硬件标准,因此硬件制造商不需要生产具有两种不同接口的硬件设备来适应不同的协议,统一采用PCIe第五代标准就足够了。如果在设备协商阶段发现对等体支持CXL协议,则CXL协议可用于操作,否则PCIe第五代可用于操作。
缓存和内存构成了一个异构的共享内存系统,它是传统共享内存系统的一个很大的扩展,使异构计算更加简单。结构上的CXL可以形成硬件支持的分布式共享存储器系统,这将使存储器级可组合基础设施成为可能。在未来的数据中心,可能会有专用于共享内存的服务器。像乐高这样的中央处理器和内存将成为现实。所有这些都有可能在未来5到10年内发生。
其他方面
开放通道固态硬盘
前几篇文章中也介绍了开放通道固态硬盘。与两年前相比,它已经被许多云制造商使用。与传统固态硬盘相比,使用开放通道固态硬盘的优势在于,可以定制FTL,以促进特定工作负载的优化。然而,我担心开放通道固态硬盘将只在短期内被云供应商采用。毕竟,大多数用户不需要定制FTL,一个通用的FTL就足够了。随着FTL对SPDK的支持,一些制造商将来可能会选择以用户模式直接运行开放通道固态硬盘。
LSM树优化
在过去两年里,这方面的进展相对较小。我读过的唯一相关论文是关于FAST '19: SLM-DB:带持久内存的单层键值存储,它优化了PMem上运行的LSM树。目前,随着输入输出设备的速度越来越快,大家都同意LSM树已经从输入输出绑定转移到了中央处理器绑定。LSM树的缺点越来越明显,这使得每个人都开始思考是否应该继续使用LSM树。
机器学习和系统
尽管机器学习系统两年前就开始工作了,但在过去的两年里没有实质性的进展。相反,机器学习系统有一些与GPU任务调度相关的工作。
无病毒的病毒
VirtIO是专门为虚拟化场景设计的协议框架。在虚拟化框架下,可以支持各种设备的虚拟化,包括虚拟SCSI、虚拟BLK、虚拟NVMe、虚拟网络、虚拟图形处理器、虚拟文件系统、虚拟锁等。虚拟设备的虚拟化功能一直是由软件来完成的,以前主要是在Qemu,现在主要是在VHost。目前,一些硬件制造商开始尝试支持虚拟化协议,并将虚拟化功能转移到硬件上,从而进一步减少主机上虚拟化带来的额外开销。这也是AWS硝基的核心技术之一。通过将虚拟化卸载到硬件,主机上几乎所有的CPU和内存资源都可以用于虚拟机,从而大大降低了运营成本。
Linux内核
目前,Linux内核已经到了5.0时代。在不久的将来,最重要的工作之一是生产制造。至于工业革命,我们以前也在文章中介绍过。与一年前相比,工业生产取得了很大的进步。目前,除了支持VFS,套接字也得到支持。为了提高性能,专门编写了一个新的工作队列。ION的最终目标是使所有系统调用异步!
摘要
回顾过去两年,存储领域取得了巨大进步。我们正处于最好的时代。工业的进步相对来说更令人兴奋。非易失性存储器、CXL协议、支持虚拟化的硬件等等都可以说是迎来了一个新时代。虽然学术界有一些好的想法,但主要的进展仍然集中在一些旧的方向上,迫切需要一些开拓性的工作。
对我们公司来说,未来的关键任务之一是如何充分利用PMem的特性来提高存储系统的整体性能。
本文由 在线网速测试 整理编辑,转载请注明出处。