本文共 2702 字,大约阅读时间需要 9 分钟。
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优化的恢复协议避免了处理日志的开销。 非易失性数据结构确保一致性。转载地址:http://orkii.baihongyu.com/