NVM(NonVolatile Memory)(非易失性内存)

NVM特性

NonVolatile Memory,非易失存储器,具有非易失、按字节存取、存储密度高、低能耗、读写性能接近DRAM,但读写速度不对称,读远快于写,寿命有限(需要像ssd一样考虑磨损均衡)。当电流关掉后,所存储的数据不会消失的计算机存储器。没有数据寻道,这点和ssd比较像。

常见NVM:

   相变存储器(PCM,phase change memory) 
   磁阻式存储器(MRAM,Magnetoresistive RAM) 
   电阻式/阻变存储器(RRAM,resistive ram) 
   铁电存储器(FeRAM, Ferroelectric RAM) 
   赛道存储器(Racetrack Memory) 
   石墨烯存储器(Graphene Memory) 
   忆阻器(Memristor,也是一种RRAM) 
具体每种特性我就不具体介绍了,因为感觉意义不大。

未来NVM可能的应用场景


完全取代内存(DRAM): 
这种做法虽然快,但带来了安全问题,很容易被野指针修改NVM上的数据,因为毕竟是内存;除此之外还得考虑往NVM上写的顺序性(因为系统会对访问内存的指令做优化,因此执行顺序可能会乱序);cache与NVM一致性的问题,怎么防止断电时cache上的新数据没有写入NVM上;同时这种模型对原有的内存模型带来巨大变化,需要我们对操作系统做出适当修改,兼容性不好。
与DRAM混合使用构成新的内存系统: 
基本和上面情况类似,甚至更复杂,但更贴合实际,因为感觉NVM就算有成型的商业化产品,价格肯定也会很昂贵,再加上还有使用寿命。因此大规模使用还是不太现实。
作为块设备(外设)使用(类似ssd): 
这种做法能有很好的兼容性,因为我们把它当做块设备来用,只要编写好它的驱动就能使用它了,并不用修改操作系统。但缺点是毕竟是外设,如果挂在io总线上的话读写速度还是很慢的。
作为cache使用 
除了掉电数据还在,但NVM的速度远低于原有cache的速度。
 

背景

新兴的存储技术提供像DRAM一样的低延迟读取/写入,但具有永久写入和大容量等类似SSD的特性。


AKA存储级内存,永久内存


最早的设备将是块地址(NVMe),但是基于块地址的设备并不被数据库研发人员所青睐,它的性能仅仅类似于一个更好更快的NAND flash内存。

后来的设备,字节地址改变了人们设计操作系统结构的方式。

发现的过程这儿就不描述了,大概就是发现了除了电容、电阻、电感以外的第四种原件,忆阻器(Memristor)。

论文How We Found the Missing Memristor和Two centuries of memristors。
 

对工业界的影响

工业界已经对标准技术和外形因素达成了统一。

Linux和微软在其内核(DAX)中增加了对NVM的支持。

2017英特尔增加了将缓存行清空到NVM的新指令。在这之前人们是无法控制CPU将缓存清空至NVM的,都是由CPU自己决定的,但是有了这些指令之后就可以确定地将数据存入NVM。

NVM DIMM 的类型

NVDIMM-F(2015)


只有闪存(flash)。必须与DRAM DIMM配对。
对于操作系统来说,太慢了


NVDIMM-N(2015)


在同一个DIMM共同含有flash和DRAM。
作为易失性存储器出现在操作系统上,比通常的DRAM大多了。


NVDIMM-P(2018)


真正的持久性内存,用到之前说过的三种技术。
没有DRAM或闪存。


NVM 对数据库系统的影响

Block-addressable NVM不是那么有趣,这在之前简单地提到了一些。

字节寻址NVM将是一个行业改变者,但需要一些工作才能正确使用。


内存数据库管理系统可以更好地使用可定制的NVM。(无法证明)
面向磁盘的DBMS最初将NVM视为更快的SSD。


论文Let’s Talk About Storage & Recovery Methods for Non-Volatile Memory Database Systems。

SYNCHRONIZATION

现有的编程模型假设任何写入内存都是非易失性的。


CPU决定何时将数据从高速缓存移动到DRAM。


DBMS需要一种方法来确保将数据从缓存刷新到NVM。

这个问题在Intel为NVM添加CPU指令集之后就被解决了。

NAMING

如果DBMS进程重新启动,我们需要确保内存数据的所有指针都指向相同的数据。

其中不仅包含索引对数据的指针,还包含类似MVCC中数据表内部的指针。

NVM-AWARE MEMORY ALLOCATOR

功能#1:同步


分配器使用CLFLUSH指令将CPU高速缓存行写回到NVM。
然后发出SFENCE指令,等待数据在NVM上变为持久。


功能#2:命名


分配器确保即使在OS或DBMS重新启动后,分配给内存映射区域的虚拟内存地址也不会改变。


DBMS ENGINE ARCHITECTURES

选择1:in-place更新


具有预写日志+快照的表堆。
示例:VoltDB


如果想要更新一个元组,先往日志中写入信息,再进行更新,最后在进行快照保存。

所以要进行3次写入,重复的数据、恢复延迟。

利用分配器的非易失性指针来记录改变的内容,而不是改变它的方式。

DBMS只需要维护一个txn的临时UNDO日志,直到它提交。


来自未提交的txn的脏高速缓存行可以由硬件刷新到内存控制器。
没有REDO日志,因为我们在提交时刷新所有对NVM的更改。


所以我们只需要2次写,就能保证数据不丢失。

选择2:copy-on-write


更新时创建表的影子副本。
没有预写日志。
例如:LMDB


对于SLOTTED PAGES,我们维护一个树形结构。当我们想要去改变一个page的某个值时,我们就需要拷贝一个副本,然后将指针维护好(包括父指针和子指针)。

那么我们也都知道复制的代价是非常大的。

对于NVM版本,我们不需要去维护一个SLOTTED PAGES中的元组,而是维护这些元组的指针。

选择3:Log-structured


所有写入都附加到日志中。 没有表堆。
例子:RocksDB


如果要更新一个元组,那么也就需要维护它的日志,它的日志不仅在内存中存在,在硬盘中也存在。这儿的数据需要拷贝多份和压缩。

对于NVM而言,就不需要磁盘上的日志维护了。

总结

存储优化


利用字节寻址能力避免不必要的数据重复。


恢复优化


NVM优化的恢复协议避免了处理日志的开销。
非易失性数据结构确保一致性。
 

猜你喜欢

转载自blog.csdn.net/sinat_22510827/article/details/107381215
nvm