首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >持久内存编程

持久内存编程

作者头像
yzsDBA
修改于 2020-04-07 03:25:24
修改于 2020-04-07 03:25:24
1.7K0
举报

持久内存编程

2013年6月我写了关于非易失性内存(NVM)的未来接口。其中描述了SNIA NVM Programming technical work group(TWG)正在开发的NVM编程模型。在过去的四年里,规范已经发布,正如预测的那样,编程模型已成为大量后续工作的重点。该编程模型,在规范中描述为NVM.PM.FILE,可以将PM当做文件被操作系统映射到内存。本文,介绍持久内存编程模型如何在操作系统中实现,已经做了哪些工作,以及我们还面临着哪些挑战。

持久内存背景

PM和storage class memory是同一的术语,具有字节寻址、加载/存储内存访问特性,但具备持久性。本文,关注将PM挂在系统内存总线上,例如DRAM DIMM,创建一类称为NVDIMMs的非易失DIMMs。

为进一步阐述所说的持久内存是什么,仅讨论NVDIMMs,允许软件像访问内存一样访问。提供了内存语义的所有优点,例如CPU CACHE一致性、其他设备直接内存访问DMA、缓冲线粒度访问,即可字节寻址。为提供这些语义,设备必须足够块以便指令访问CPU时拖延CPU合情合理。NAND flash当做持久内存时比较慢,因为需要以块为单位进行访问,并需要足够长的时间进行上下文切换。硬件访问的时间通常以毫秒为单位,NAND Flash SSD以微妙为单位,PM以纳秒为单位。依赖于硬件媒体类型,NVDIMM可能速度还比不上DRAM,但是速度已经堪比他的速度了。

现在市场上的一些NVDIMM产品,运行时使用DRAM作为媒介,断电时自动将内容备份到NAND Flash,再次上电时将NAND Flash内容返回DRAM。这些产品提供DRAM的性能,但是需要额外的部件和电池来存储数据,相比DRAM,为每个DIMM提供小容量、每G高消耗的特性。新出现的非易失性媒介,例如2015年,Intel和美光联合研发的3D XPoint技术,通过比DRAM更高的容量。每个CPU达到上T的带宽,使持久内存引起多方前沿关注:持久性、容量、消耗。

持久内存编程模型

如何是应用访问持久内存?和易失性内存不同,应用需要特定方法和指定的持久内容连接;持久内存不像易失性内存一样是匿名的,他需要像文件一样命名一个区域,这样应用才能找到他。应用需要具有访问持久内存的控制权限。推荐SNIA TWG编程模型是因为操作系统可以使用标准的文件语义提供持久内存的命名、权限和内存映射

当前,多种操作系统包括LinuxWindows都支持了这种模型。

DAX

Figure 1中显示的持久内存适配的文件系统,允许直接访问持久内存,而不经过系统的page cache。这样的特性称为DAX。持久内存编程模型和DAX特性表明持久内存文件可以使用mmap()或MapViewOfFile()类似的标志函数映射到内存。这种类型时图1最右边形式。应用直接通过load/store指令访问持久内存。允许直接访问持久媒介而不用进行用户态和内核态的切换。

存储持久化

Linux系统可以使用msync()或fsync()确保数据持久化,Windows可以通过FlushViewOfFile()和FlushFileBuffers()确保数据持久化。这些调用会创建一个内存栅,这个点之前的数据都已经全部持久化到持久内存。历史上,这个存储栅需要操作系统找到page cache中的脏页,然后将他们刷写到磁盘。由于持久内存不使用page cache,操作系统仅需要将CPU cache中的变动刷写到持久内存。如图2所示:

图2中虚线部分显示了持久域。这种级别的架构,虚线部分的数据要么在DIMM,要么咋内存控制器的写请求队列WPQ。无论哪种返回,持久内存需要有足够的电量将虚线框中的数据刷写到持久媒介。这种特性叫做异步DRAM刷,并NVDIMM已经具备这种特性。

X86架构中,简单执行存储指令并不能确保数据持久化,因为数据可能仍然在CPU cache,一旦断电,这些数据就会丢失。需要额外的刷写指令确保数据持久化。下表描述了他们如何工作。

图2和表1中可能会使人迷惑,为什么Intel不将CPU cache弄到持久域部分。技术上可行,图2中的虚线框内包括CPU CACHEs。

扩展持久域包括CPU CACHEs的问题是x86的caches非常大,他需要的电量比电容器实际能提供的电量多的多。这就意味着平台需要电池。此时支持持久内存的服务器都配一个电池不太现实。但是对于硬件供应商来说,当然有可能在其商品中包含一个电池。这就允许跳过表1中描述读缓冲刷新指令,但是sfence指令仍然是必须的,因为存储屏障存储只有在全局可见时才被认为是持久的,这就是sfence确保的。

因为应用供应商计划使用电池以及未来期望所有平台都将CPU cache包含到持久域,所以在ACPI中添加一个属性,这样当跳过CPU刷时,BIOS可以通知操作系统。这就允许操作系统以最优的方式实现类似msync的调用。

刷写用户空间到持久域

WBINVD例外,Intel CPU以用户态模式支持表1中描述的指令。使用CLWB(CLFLUSHOT或CLFLUSH)刷写cache line并支持用用户态使用临时存储。

这就允许从用户空间刷写到持久内存,而不需要经过内核,这个特性称为Optimized Flush。依赖于操作系统和硬件,各个平台选择性支持这个特性。尽管有CPU支持,但是对于应用程序来说只有操作系统说安全时才使用optimized flush。当文件系统元数据改变需要msync刷写时,操作系统需要这个控制点。

当前实现中支持安全的用户空间刷正不断演化。Windows的DAX由NTFS文件系统提供,包括无条件支持Optimized flush。Windows使用类似CLWB+SFENCE的指令保持数据持久化到持久内存。Linux中的ext4和xfs支持DAX,不需要考虑用户空间刷写安全性。作为临时解决方案,Linux提供Device-DAx,允许应用打开持久内存设备,将其映射到内存,利用用户空间刷写确保持久性。

Libpmem库提供函数告诉应用程序何时Optimized flush是安全的。强烈建议程序员使用libpmem来确定并使用用户空间刷写。Libpmem也被用来检测平台使用电池的情况,将刷写调用转换成简单的sfence指令调用。下文会详细介绍这个库。

持久内存挑战

内存中数据结构改变时原子性问题就出现了。其他线程访问这个数据结构时会不会仅考到修改到一半的数据?多线程编程时通常使用锁来保护数据结构。有时也会使用指令确保硬件中的原子性。本文中原子性也成为可见性,当修改提交时,另外一个线程才能看到这个线程的修改。

Libpmemobj库提供事务保证,确保断电安全。在持久内存出现前,断电等中断写时,内存状态不会出现问题,因为是易失的。但是持久内存中,需要理解部分状态刷后就已经持久化。Intel仅使用8字节存储确保故障原子性。大于8字节的将不保证数据一致性

其他挑战:管理空间。因为持久内存域被当做文件,文件系统可以管理这个空间,但是一旦被应用映射到内存,文件中发生的事情完全取决于应用。和malloc类似的函数分配的内存是易失的,在重启时不提供方法重连持久内存对,也不辞去任何步骤保证出现故障时数据一致性。所以持久内存编程中也需要着重处理空间分配问题。

地址独立性是另一个挑战。尽管技术上可以实现持久内映射到同一个地址上,但是当其他映射items大小改变时,这就不切实际了。一种地址空间布局随机化的特性会使操作系统随机调整库和文件映射地址。地址独立意味着持久内存中数据结构引用另一个使用指针的数据结构,即使文件映射到不同地址,这个指针也必须以某种方式使用。有几种方法实现这一点,例如在映射后重新定位指针,使用相对指针而不是绝对指针,或者使用某种类型的对象ID来应用驻存在持久内存中的数据结构。

NVM库

Intel开发的pmdk库,在GitHub上开源,开源协议BSD,使用手册可从http://pmem.io查看。

libpmem:基本库

这个库比较小,相对简单,包含探测CPU支持哪种刷写指令以及使用最佳指令进行范围拷贝。

libpmemobj:支持事务

Libpmemblk和libpmemlog:支持特定用户案例

Libmemkind:持久内存易失性使用

总结

2013年的ideas成熟了并加到了完整的编程模型中。Pmdk库被开发出来,以供持久内存编程使用。该库在GitHub上开源https://github.com/pmem

原文

https://www.snia.org/pm-summit2019

https://www.snia.org/pm-summit2017

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货:Linux 文件系统与持久性内存介绍
在 Linux 系统中一切皆文件,除了通常所说的狭义的文件以外,目录、设备、套接字和管道等都是文件。
逆锋起笔
2021/09/29
2.9K0
怎样让数据库再快一点?
| 作者 张鹏义,腾讯云数据库高级工程师,曾参与华为Taurus分布式数据研发及腾讯CynosDB for PG研发工作,现从事腾讯云Redis数据库研发工作。 ---- 存储体系结构 回顾一下计算机的存储体系结构。正如下图所示,计算机存储设备根据访问速度及容量等形成了一个金字塔形的层次结构。在这个层次结构中,从上到下,设备的访问时延越来越大,容量也越来越大,而每字节的造价也越来越便宜。在这个层次结构中,每一层都被看作是其下一层次的缓存。 同时在这个层次结构中存在一个明显的分界线,如图中绿色的虚线。在
腾讯云数据库 TencentDB
2020/10/09
2K0
持久内存+RDMA让远程数据不再远-总结
第一届「中国云计算基础架构开发者大会」(以下简称 CID)将在 2020 年 10 月 25 日举办。会中看到有新硬件PM结合RDMA的议题,这是数据库方面前沿技术,对下一代数据库发展有重要影响。听后进行总结。
yzsDBA
2020/11/09
2.4K2
持久内存+RDMA让远程数据不再远-总结
postgresql email列表对NVM WAL BUFFER的讨论
本文介绍NVM WAL BUFFER的email list,详细了解开发者对此的讨论,以此深入
yzsDBA
2021/01/05
6670
非易失性数据库系统存储与恢复方法
非易失性内存的出现从根本上改变了数据库管理系统的内存和持久存储的架构。这些新型NVM设备具有堪比DRAM的速度,但是写到NVM设备后这些数据就具备了持久性。因为现现有的数据库管理系统基于内存是易失的这样的条件下,所以并不能充分利用这项技术。通过NVM,传统数据库管理系统的很多部件都将变得不再必要,并且会降低数据库的性能。
yzsDBA
2020/07/20
1.5K0
非易失性数据库系统存储与恢复方法
应用PMDK修改WAL操作使之适配持久化内存
这几个补丁能够通过使用PMDK对存储在持久化内存PMEM上的WAL日志进行读写。PMEM是下一代存储介质,具有一系列特性:快速、字节寻址、非易失。
yzsDBA
2020/10/28
9110
持久内存挑战与应对:VAST vs MemVerge
想象一下,应用程序启动不再需要漫长等待,数据处理速度飙升至前所未有的水平。这正是持久内存(PMEM)的魅力所在,它模糊了内存与存储的界限,带来了字节级访问的低延迟和数据持久性。然而,这种革命性的技术并非没有挑战:如何确保数据真正持久化?如何在高并发环境下保证数据一致性?内存泄漏为何会变得“持久”?这些问题让PMEM的编程和应用变得复杂。
数据存储前沿技术
2025/06/15
1330
持久内存挑战与应对:VAST vs MemVerge
非易失性内存技术及数据库
“2013年开始这个项目的研究,当时不确定非易失性内存技术是否可商用。2019年Intel商用了NVM产品,NVM对下一代数据库系统的影响吸引了广大研究者”--Joy Arulraj和Andrew Pavlo。
yzsDBA
2020/05/17
1.8K0
非易失性内存技术及数据库
持久内存指令(PMDK)简介
libpmem库主要特性是提供一种将脏数据刷写到持久内存的方法。常用的函数主要包括pmem_flush、pmem_drain、pmem_memcpy_nodrain。由于CPU CACHE内容向PM刷写的时机和顺序不受用户控制,所以需要特定指令进行强制刷写。pmem_flush的功能为调用CLWB、CLFLUSHOPT或CLFLUSH指令强制将CPU CACHE中内容(以cache line为单位)刷写到PM;指令发起后,由于CPU是多核,cache中内容到PM的顺序也不一样,所以还需要pmem_drain即调用SFENCE指令,确保CLWBs全部执行完成。如果pmem_flush调用的指令是CLFLUSH,则该指令中包含sfence,所以理论上不再需要调用pmem_drain,实际上如果是这个指令的话,pmem_drain什么也不做。
yzsDBA
2020/10/28
1.9K0
持久内存指令(PMDK)简介
火爆业界的明星,下一代存储技术的先行: NVDIMM 你了解吗?
随着存储技术的发展, 对存储性能的不懈追求, 高性能存储开始探索向内存通道的迁移。在这样的情况下, NVDIMM 技术便应运而生了。
Linux阅码场
2019/07/12
1.6K0
火爆业界的明星,下一代存储技术的先行: NVDIMM 你了解吗?
持久内存指令(PMDK)简介
libpmem库主要特性是提供一种将脏数据刷写到持久内存的方法。常用的函数主要包括pmem_flush、pmem_drain、pmem_memcpy_nodrain。由于CPU CACHE内容向PM刷写的时机和顺序不受用户控制,所以需要特定指令进行强制刷写。pmem_flush的功能为调用CLWB、CLFLUSHOPT或CLFLUSH指令强制将CPU CACHE中内容(以cache line为单位)刷写到PM;指令发起后,由于CPU是多核,cache中内容到PM的顺序也不一样,所以还需要pmem_drain即调用SFENCE指令,确保CLWBs全部执行完成。如果pmem_flush调用的指令是CLFLUSH,则该指令中包含sfence,所以理论上不再需要调用pmem_drain,实际上如果是这个指令的话,pmem_drain什么也不做。
yzsDBA
2020/09/15
1.1K0
持久内存指令(PMDK)简介
非易失性WAL buffer
今天看到PG邮件列表里有非易失性内存在PG应用的讨论,做下记录,接着学习其补丁,如何将WAL buffer改造成非易失性buffer,以及和之前有和区别。该补丁是也是日本NTT公司提供。 一、原文
yzsDBA
2020/01/30
6030
非易失性WAL buffer
OpenGauss与NVM
NVM(非易失性内存),也叫PM(持久内存)具有可字节寻址、大容量、非易失型和堪比DRAM的速度等特性。随着英特尔傲腾产品的出世,现有数据库适配这种新型硬件显得更加有必要。
yzsDBA
2023/08/09
3700
OpenGauss与NVM
Storage Developer Conference 2020总结
Storage Developer Conference 2020有两篇关于PM适配PG的议题。一篇是之前总结过的memhive,一篇为NVM WAL BUFFER。
yzsDBA
2020/12/03
6360
Storage Developer Conference 2020总结
管理数据库系统中的非易失性内存
Managing Non-Volatile Memory in Database Systems
yzsDBA
2020/07/22
1.3K0
管理数据库系统中的非易失性内存
SNIA:数据加速 SDXI、DPU和存储
SDXI被设计为一种内存到内存的数据移动和加速接口,具有可扩展性、前向兼容性和独立于I/O互连技术的特点。通过一系列的示例使用模型,文章展示了SDXI在各种应用中的潜力,例如数据持久化、虚拟化数据移动和数据转换等。此外,还探讨了SDXI在未来版本中可能引入的新功能,如操作系统的独立用户空间软件库、驱动程序工作和安全特性增强。
数据存储前沿技术
2025/02/11
2410
SNIA:数据加速 SDXI、DPU和存储
内存数据库及技术选型
依靠内存来存储数据的数据库管理系统,也称为内存数据库,成为了解决高并发、低时延数据管理需求的技术路线。近年来,随着动态随机存储器(DRAM)容量的上升和单位价格的下降,使大量数据在内存中的存储和处理成为可能,Redis、Memcached等内存数据库管理软件逐渐成熟,应用范围越来越广。
kirito-moe
2021/09/08
5.5K0
内存数据库及技术选型
NVM作为主存上对数据库管理系统的影响
implications of non-volatile memory as primary storage for database management systems
yzsDBA
2020/01/19
1.9K0
NVM作为主存上对数据库管理系统的影响
Managing Non-Volatile Memory in Database Systems
Managing Non-Volatile Memory in Database Systems
yzsDBA
2020/10/28
7710
Managing Non-Volatile Memory in Database Systems
NVM原生数据库技术解读
为让更多数据库从业者了解数据库领域最新研究成果,熟悉行业前沿发展趋势,腾讯云数据库计划举办系列“DB · 洞见”活动,打造数据库技术交流平台,邀请学界及腾讯技术大咖,解读数据库基础技术创新趋势,分享数据库技术创新成果。 今天为大家带来“DB · 洞见”系列活动第一期的部分内容,由中国人民大学信息学院计算机科学与技术系主任柴云鹏教授解读NVM原生数据库技术,以下是分享实录: NVM原生数据库概述 今天我分享的主题为“NVM原生数据库技术”,内容分三个部分,主要涉及到下面这五篇VLDB 2021的论文。首先我
腾讯云数据库 TencentDB
2021/10/26
1.4K0
相关推荐
干货:Linux 文件系统与持久性内存介绍
更多 >
交个朋友
加入数据技术工作实战群
获取实战干货 交流技术经验
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档