APP下载

基于国产平台的非易失功能模拟方法

2022-03-01李欣泽孙大东濮约刚

计算机工程与设计 2022年2期
关键词:内核内存驱动

李欣泽,孙大东,濮约刚,马 帅

(中国航天科工集团第二研究院七〇六所,北京 100854)

0 引 言

长期以来,处理器访问内存与外存设备间存在巨大延迟,传统的计算机体系结构中一般将内存和外存作为两个独立的部分,因此产生了分层存储技术,将那些处理器急需处理的数据通过预测等方法,提前放置在快速访问的存储层中。随着新一代内存技术的发展,尤其是非易失内存的出现,对计算机体系中的由处理器内部缓存、内存、外存3个层级的数据存储架构发起挑战。基于字节寻址的非易失内存(non-volatile memory,NVM),具有与动态随机存取存储器(dynamic random access memory,DRAM)相近的性能、高集成度和较低的静态能耗等优秀特性,为存储系统的发展提供了重大机遇,吸引了研究人员的广泛关注。NVM的出现有效弥合了内存与外存之间的差距,模糊了二者之间的界限。然而NVM自身也存在局限性,例如有限的读写使用寿命、不对称的读写延迟、较高的成本、无法与传统内存原位替代等,限制了NVM在工业界的应用。

由于自身的属性限制,当前针对NVM的研究多采用DRAM模拟的方式开展,主要实现对NVM读写性能的模拟测试,而并未能实现NVM掉电后数据不丢的功能。若要实现后者,现阶段往往需要针对NVM设备重新设计主板,成本高昂。同时,现阶段隶属于ARM指令集的国产处理器,以及国产操作系统对非易失内存的支持不够友好。因此本文提出了一种非易失内存模拟方法,基于国产通用服务器平台和国产操作系统,在软件层面对DRAM等易失性内存进行模拟,使其具有非易失内存掉电数据不丢的功能。为了在软件层面实现对非易失功能的模拟,本文实现的模拟方法对操作系统内核和设备驱动进行了相应的修改,并开发了用户态的应用软件,该模拟方法绕过了对硬件的调整与修改,可以在现有硬件条件不改变的情况下,支持服务器内存实现非易失功能。

1 非易失存储及其模拟方法

近年来,非易失存储技术得到了快速发展,在寻址方式上主要分为块寻址和字节寻址两种[1]。块寻址的非易失存储设备以闪存(Flash)为代表,主要分为NOR Flash以及NAND Flash两类,主要适用于外存;对于字节寻址的非易失存储设备,主要适用于内存,习惯上被称之为持久性内存(persistent memory,PM),与之类似的名词还有存储级内存(storage class memory,SCM)等,目前学术界对字节寻址的非易失内存设备统一称为持久内存。

字节寻址的非易失内存设备主要包括磁性存储器(Magnetic RAM,MRAM)、自选扭矩转换随机存储器(Spin-Torque Transfer RAM,STT-RAM)、阻变存储器(Resistive RAM,RRAM)、相变存储器(Phase-Changed RAM,PCRAM or PCM)等。块寻址和字节寻址的非易失存储设备之间有广泛的共同点,例如较低的访问时延以及非易失性,它们之间的区别也相对明显,这些差异直接影响存储器的基本指标,例如访问延时、存储密度、设备耐久以及每个存储单元中存储的位数等等[2]。表1展示了DRAM与部分非易失存储器的特性对比。

表1 DRAM与部分非易失存储器的部分特性[3]

闪存与持久内存处在不同的发展阶段,关于持久内存的研究大部分在实验室中进行,而闪存的一些研究成果已经被商业化,广泛应用于固态硬盘(solid state disk,SSD)中,取得了优秀的成果[4]。对于持久内存的应用方面,非易失双列直插存储模块(non-volatile dual inline memory module,NVDIMM)是目前唯一商用的持久性内存存储器件[5],NVDIMM采用闪存和DRAM混合的方式,使用电容供电或者后备电源供电的方式保证DRAM数据掉电不丢。2015年,英特尔和镁光公司联合发布了3D-XPoint技术[6],并于2019年发布了基于DIMM接口的傲腾内存[7](Optane DC Persistent Memory)。随着非易失存储器技术的进一步发展与应用,基于该技术构建持久性主存存储系统是满足应用日益增长的性能需求的有效方法。

虽然NVM的出现有效弥合了内存与外部存储之间的差距,模糊了内外存之间的界限,但是因其自身的局限性,例如有限的设备寿命、昂贵的成本以及不对称的读写延迟等,限制了NVM的规模化应用[8]。因此,为了满足研究人员对NVM的需求,一个折中的办法是在现有的存储介质上进行一定程度的修改来模拟NVM。一些工作通过调整内存的访问时延、带宽等方式来模拟非易失内存,Duan等提出的HME[9]基于NUMA架构实现了对混合内存结构(DRAM+NVM)的读写带宽以及延迟的模拟,主要通过判断cache是否命中来区分不同的写操作类型。这些工作往往需要特定的硬件支持,或者仅对于特定的内存结构有效,在一定程度上缺乏可扩展性和可移植性。

因此为了使研究人员尽量减少对现有硬件的修改与调整,从而快速开展针对NVM的研究工作,一些工作在相对通用内存结构上进行非易失内存模拟。Hu等提出的NVM Streaker[10]不需要复杂的硬件以及对操作系统的支持,通过硬件参数配置层以及软件干扰机制实现非易失内存模拟,其优势在于通过硬件参数的配置可以实现多种NVM的灵活模拟。这些工作的局限性也较为明显,多使用x86指令架构的英特尔处理器,在隶属ARM指令架构的FT2000+/64等国产处理器上没有相应的支持,扩展性和可移植性不佳。

目前关于NVM的模拟工作,主要针对NVM读写时延[11]、磨损情况[12]等性能指标的模拟,对于实验室中的研究工作具有重要的意义,但是在实际的工程应用中,非易失内存模拟技术并未关注非易失存储设备最基本的“非易失”功能,即关机时保存数据以及开机时恢复数据,因此无法满足实际工程应用中对非易失存储设备的需求。

2 设计与实现

本方法主要是在DRAM等易失性内存上模拟非易失存储功能,因此需要操作系统将DRAM当作非易失内存看待。总的来说,本方法较传统方法相比,进一步实现的核心功能为关机时数据保存以及开机后数据恢复功能。在数据保存时,应用层程序需要读取内存条中的数据并写入备用存储介质中,备用存储介质的功能类似于NVDIMM-N内存条中Flash闪存的作用,即起到持久化数据存储的作用;在数据恢复时,应用层程序读取备用存储介质中的数据,将其写入DRAM中,起到存储状态恢复的作用。在具体实现中,本文实现的非易失存储功能模拟使用DRAM+NVMe固态硬盘的架构,通过NVDIMM总线将DRAM注册为非易失存储设备,使用NVMe固态硬盘作为持久化数据存储设备。

目前的国产操作系统并未实现对非易失内存的支持,因此需要在国产操作系统上对非易失内存进行驱动适配开发以及设计实现应用层的访问接口,同时对操作系统内核进行相应的修改。

2.1 应用层设计

本方法的应用层设计思路如图1所示。

图1 应用层设计

非易失存储设备的非易失性具体表现在系统掉电之后数据不丢,该功能可以拆解为关机时数据保存到备用的存储介质中以及开机时从备用存储介质中读取数据并写回到DRAM中。因此应用层的设计分为两个部分:一是开机恢复数据,二是关机保存数据,而这两个部分的主要功能十分类似,区别仅在与开机恢复数据是从读取备用存储设备向内存中写入数据,而关机保存数据是从内存读取数据向备用存储设备写入数据,因此设计思路十分相似。

在关机保存数据和开机恢复数据的应用层设计中,本方法将内存划分为固定大小的数据区,对每个固定大小的数据区,使用多个进程来对其进行更细粒度的访问与写入,在每个数据区中,每个进程负责的更细粒度的数据块的相对位置是固定的。举例来说,进程1负责每个数据区中相对地址为0-2 GB空间内共2 GB大小数据块的读取与写入,进程2负责每个数据区中相对地址为2 GB~4 GB空间内共2 GB大小数据块的读取与写入,以此类推。

总之,在应用层的设计中,需要内核层提供数据区以及数据块的虚拟地址,以及数据块的总数,因此在驱动层的设计中,需要将这两部分数据通过ioctl接口提供给应用层。

2.2 驱动层设计

本节中提到的非易失内存在物理层面上是DRAM内存条,只是在操作系统层面将其视为非易失内存,具体表现为将DRAM内存条通过NVDIMM总线注册为非易失内存。本方法的驱动层设计的整体架构如图2所示。

图2 驱动层设计整体架构

本节接下来的内容将详细论述每个驱动部分的具体功能与设计思路。

2.2.1 非易失内存接口参数驱动

非易失内存内核参数接口驱动提供一种基于操作系统内核参数的非易失内存设备注册方法,利用系统启动时内核参数传递非易失内存的地址空间信息,然后由操作系统内核向NVDIMM总线完成非易失内存的注册。

基于内核参数接口的非易失内存注册处理具体的实现思路是在内核处理参数函数中新增加对于非易失内存的支持,按照类似操作易失内存的注册流程使用非易失内存。具体设计是将非易失内存的物理地址空间和对应的地址空间大小追加到内核的引导参数之后,可以在内核启动参数中多次添加非易失内存配置项从而实现多个非易失内存的注册。在固件加载操作系统内核并引导操作系统后,操作系统在启动内核参数处理函数中检测到非易失内存配置参数,随后从内核的普通内存访问空间中移除相应大小的地址空间。将移除的地址空间插入到内核的IOMEM资源列表中,并将该资源置为PMEM,检测并添加非易失内存设备。当所有的非易失内存设备添加完成后,遍历IOMEM资源列表,查找是否具有标记为PMEM的资源,向操作系统注册一个设备名称为PMEM的平台设备。最后,操作系统非易失内存的平台设备驱动初始化,依次遍历IOMEM资源,通过NVDIMM总线的设备注册接口将PMEM资源所表示的地址注册为非易失内存设备。

该驱动实现了一种简单的非易失内存注册方法,方便非易失内存的配置,而且也可用于在服务器没有非易失内存条的情况下使用普通内存模拟非易失内存,验证操作系统的非易失内存相关的驱动功能。

2.2.2 非易失内存地址空间合并

非易失内存地址空间合并的主要功能是实现将内核的IOMEM资源列表中所有标志为PMEM的内存资源空间合并成一个地址空间。合并之后的一个地址空间对应着一个namespace节点。通过namespace节点可以访问所有的、离散的非易失内存地址空间。这样做可以兼容现有的工具以及用户层程序的接口。从用户层视角来看,非易失内存是一整块完整的内存空间,而不必关心是否是离散的内存地址空间。而对于内核层的实现,需要在Linux内核层的非易失内存驱动中将离散的非易失内存对应的物理地址空间逐次注册进驱动中,最后建立物理地址空间与虚拟地址空间之间的映射关系。图3是非易失内存地址空间合并。

图3 非易失内存地址合并

在非易失内存的驱动注册非易失内存物理地址空间时,本方法只注册一块物理地址空间,其它物理地址空间不注册,但是统计所有的物理地址空间的大小,即将所有的物理地址空间进行累加,将累加后的物理地址空间总大小作为申请空间的接口函数参数并申请一块虚拟地址连续的虚拟地址空间。然后根据物理地址空间的首地址的升序原则,依次将每个物理地址空间与申请的虚拟地址空间对应的偏移位置进行映射。memmap预留地址空间,即通过grub参数,将普通内存条上的部分物理地址空间预留出来作为模拟NVDIMM内存使用。预留出来多块物理地址空间,将物理地址映射到申请的连续虚拟地址空间中。从用户层来看,实际的非易失内存分布情况对其透明,便于文件系统等其它系统软件的开发。

非易失内存的释放与注册一一对应,如果每次仅仅申请新的虚拟地址空间,而不进行释放,系统运行一段时间后,会将空闲的虚拟地址空间耗尽,导致系统异常。所以在申请并且注册了非易失内存后,在退出的时候需要将注册的虚拟地址空间释放。而释放的时候需要根据之前注册的地址块和空间大小进行释放。

2.2.3 非易失内存设备驱动设计

本方法实现的非易失内存模拟实现了3种驱动方式:分别是字节访问设备驱动、标准块设备驱动以及直接访问块设备。下面分别介绍其实现细节:

字节访问设备驱动将非易失内存注册为字符设备,字符设备提供open和mmap操作接口,应用程序打开字符设备后,可以通过mmap直接将非易失内存映射到程序地址空间,按照类似memcpy/memset的方式使用非易失内存。处理器直接使用LOAD和STORE指令读写非易失内存对应的物理地址空间,跳过Linux内核的页缓存和通用块设备层,无需特殊的驱动作为访问中转,完全由应用程序自己维护非易失内存空间的数据组织管理,因此字符模式设备驱动对应用程序是非透明的,需要应用程序针对非易失内存进行修改,能够感知到非易失内存设备的存在。图4是字符设备驱动。

图4 字符设备驱动设计

非易失内存标准块设备驱动在内核中引入块设备封装层(block translate table,BTT),保证对非易失内存每次更新一个块设备扇区都是原子的,即对一个块内容的更新要么全部成功要么全部失败,从而可以保证在系统突然掉电时对非易失内存块数据更新的原子特性。BTT的实现方法是建立一个逻辑的LBA和真实的LBA之间的映射表,每次更新的时候,先完成物理LBA的更新,然后再刷新BTT转换表中块逻辑LBA和块真实LBA的对应关系,通过BTT封装层可以保证操作系统每次更新非易失内存设备块时都是完整的。标准块设备驱动对应用程序提供标准的块设备,支持现有的块访问模式,对应用程序来说是透明的,应用程序可以使用操作系统内核里实现的软RAID、镜像、加密、压缩等中间层驱动所带来的功能。

非易失内存直接访问块设备类似标准块设备,支持现有的块访问模式,但是支持文件系统绕过内核的页缓存直接访问。操作系统的页缓存主要是针对传统的低速存储介质的内核读写缓存机制,主要目的是提升存储介质的读写性能,然而对于高速低延迟的非易失内存,其读写带宽和延迟均接近普通内存,此时再使用内核的页缓存机制并不能提升读写带宽,反而会增加读写的延迟,而且由于使用普通内存作为数据缓存,增加非易失内存在异常掉电时数据不一致的风险。

2.2.4 数据保存恢复驱动

在本方法中,将每个DRAM内存条看作字符设备,提供open、read以及write等操作接口,应用程序打开字符设备后,按照正常使用字符设备的方式读取或者写入非易失内存。向内核注册并创建内存条对应数目的字符设备,随后记录IOMEM中的内存条物理地址信息,包括起始物理地址、大小以及内存条编号等等信息,之后根据记录的内存条信息以及内核给出的DRAM信息,给每个内存条分配一个相应大小的虚拟地址空间,并在页表中建立内存条物理地址空间与虚拟地址空间之间的映射,最后根据记录的内存信息,将内存条上的数据划分为固定大小的数据区,并记录每个数据区的起始虚拟地址,通过ioctl将这些数据区起始虚拟地址提供给应用层。图5展示了数据保存恢复驱动与应用程序之间的交互。

图5 数据保存恢复驱动与应用层的交互

3 测试与验证

3.1 实验条件与环境

本文基于国产处理器平台飞腾2000+/64位设计以下实验,对比了使用非易失模拟功能的易失性内存机器与使用真实的NVDIMM-N非易失内存机器之间的数据存储、数据恢复功能的执行时间和读写性能,得到了这两种情况下的数据存储、数据恢复时间等性能结果,并且分析了得到本文实验结果的原因。

实验中采用了两台NUMA架构服务器,一台支持NVDIMM-N非易失内存条的使用,并对固件、基板管理控制器(baseboard manage controller,BMC)等进行了调整与修改,另一台使用普通的DRAM内存条,并使用NVMe固态硬盘作为备用存储介质实现持久性数据存储,详细配置分别见表2和表3。

本章接下来的部分将详细说明关机阶段数据存储以及开机阶段数据恢复等功能执行时间的实验设计以及数据存储恢复时读写性能的实验设计,并且分别对实验结果进行分析。

表2 支持NVDIMM-N的主机配置

表3 使用本文模拟方法的主机配置

3.2 数据保存恢复功能的执行时间

本文分别测量了使用非易失功能模拟以及使用真实的NVDIMM-N内存条时,数据保存以及恢复所消耗的时间。对于非易失功能模拟的执行时间,可以通过统计进程开始以及执行结束的时间相减得到,对于使用真实的NVDIMM-N的执行时间,可以通过连接串口统计关机数据保存以及开机数据恢复功能的开始和结束时间。实验过程中,进行多次实验对每种功能的执行时间取平均值,实验结果见表4。

表4 执行时间对比/s

根据实验结果,使用非易失内存模拟执行数据保存以及数据恢复的执行时间要小于使用NVDIMM-N内存的执行时间,通过分析,主要原因如下:第一,在非易失功能模拟方法中,使用了多进程的设计思想,充分发挥了CPU的性能,加快了数据保存以及数据恢复的处理速度;第二,在实验中发现,使用NVDIMM-N执行数据保存和数据恢复时,有很大可能出现执行超时重新执行的现象,表现在实际使用中,会出现长达7 min到9 min不等的长时延。出现这种情况的原因是复杂多样的,其中比较重要的一点是前文曾经提到的,使用非易失内存时需要对服务器的硬件设计以及固件等进行修改,而这些修改并不能完全保证非易失内存使用的稳定性,因此限制了非易失内存在实际的工程应用中效率的发挥。而使用纯软件的非易失功能模拟,在内核层、驱动层以及用户层进行开发与修改,会绕过对硬件的修改,简化实现模拟非易失存储功能的难度。

3.3 数据保存恢复功能的读写性能

上文的评价指标是数据保存以及数据恢复的执行时间,在一定程度上可以说明相比于使用NVDIMM-N内存实现非易失功能,本文提出的使用DRAM+NVMe进行非易失功能模拟方法在性能上有一定的优势,但是针对时间指标的验证粒度比较粗,因此,为了进一步验证上述两种实现非易失功能的性能差异,进行对于读写性能的测试与验证,读写性能越高,也就表示在实现非易失功能时的效率越高。

本次实验中,针对不同的读写方式,测试设备的每秒读写次数(Input/Output Per Second,IOPS)以及传输带宽来表示设备的读写性能。本次实验使用开源测试工具fio测试块大小为4 kB,进程数为8时,上述两种方法的IOPS以及传输带宽。实验针对顺序读、顺序写、随机读、随机写、顺序读写随机读写等6种IO方式进行了测试,得出以下实验结果。图6和图7分别测试了模拟方法与实际的NVDIMM-N内存设备在顺序读、顺序写、随机读、随机写、顺序读写以及随机读写任务中的IOPS指标;图8~图10分别测试了模拟方法与实际的NVDIMM-N内存设备在顺序读、顺序写、随机读、随机写、顺序读写以及随机读写任务中的带宽指标。

图6 模拟方法与NVDIMM-N设备IOPS对比(1)

图7 模拟方法与NVDIMM-N设备的IOPS对比(2)

图8 模拟方法与NVDIMM-N设备读带宽对比

图9 模拟方法与NVDIMM-N设备写带宽对比

图10 模拟方法与NVDIMM-N设备读写带宽对比

根据上述实验结果,可以发现在顺序读和随机读方面,使用NVDIMM-N的性能要优于使用DRAM+NVMe的非易失功能模拟方法,在顺序写、随机写、顺序读写以及随机读写方面,使用DRAM+NVMe的非易失功能模拟方法的读写性能整体上优于使用NVDIMM-N的读写性能,根据分析思考,主要原因是在使用非易失功能模拟时,本质上是通过NVDIMM总线将DRAM设备注册为非易失内存设备来使用DRAM的,而DRAM本身的读写性能整体上优于NVDIMM-N等非易失内存设备。

4 结束语

本文使用DRAM作为内存,NVMe固态硬盘作为备用存储介质,通过对应用层、驱动层以及内核层的软件层面上的修改,实现了一种非易失功能模拟方法,该方法绕过了对通用设备硬件的修改,在软件层面实现了非易失功能。本文进一步将使用非易失模拟功能的设备与真正的非易失内存条NVDIMM-N设备进行实验对比,验证了本文提出的方法在数据保存以及数据恢复功能上的执行时间较短,读写性能整体上较优,在对非易失内存有使用需要的工程实践中具有应用推广价值。

本文将非易失内存视为外部存储设备使用,通过DRAM与NVMe之间的配合,可以替代NVDIMM-N设备而作为一个持久化数据存储层,在一定程度上对非易失功能进行了模拟。

但是NVDIMM-N等非易失内存作为内存使用的方向潜力巨大,有很大的可能改变现有的内外存分层存储架构,因此未来的工作可能要更加关注将非易失内存作为运行内存使用,例如保存系统状态等方面的工作。

猜你喜欢

内核内存驱动
多内核操作系统综述①
数据驱动世界。你得懂它 精读
基于模糊PI控制的驱动防滑仿真系统分析
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
屈宏斌:未来五年,双轮驱动,砥砺前行
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
微软发布新Edge浏览器预览版下载换装Chrome内核
深入实施创新驱动发展战略