Managing Non-Volatile Memory in Database Systems
一、背景及动机
1、几种场景的NVM存储方式
NVM-DIRECT
将nvm放到内存总线上,直接访问。数据和WAL日志都在NVM上。但是CPU CACHE中的内容易失且刷写到NVM的时机和顺序都不受控制,所以为保证持久化及数据一致性需要调用命令clwb和sfence来确保。
优势:日志量少,轻量日志,恢复高效。直接从NVM读取,读操作简单。WAL日志可以不需要,只需要独特轻量日志?这个日志什么结构及如何工作?事务提交立即将脏页写入NVM,只需要少量undo需要回滚。
劣势:NVM相对于DRAM,高延迟,性能还是有很大差距的。NVM擦写次数有限,可能造成硬件故障。程序直接应用到NVM上比较困难,任何修改都可能已经持久化到NVM。
BASIC NVM BM
DRAM NVM的架构,DRAM中缓存数据页并在内存中修改,以页为单位将其刷写到NVM或从其读取。
本文在DRAM NVM基础上,设计新的NVM BUFFER管理机制。
二、解决方案
同样以三层存储架构,利用NVM字节可寻址特性,将数据页分割成一个个cache line大小(64字节),以cache line大小为单位进行刷写和读取。
Cache line page
页头信息包括:nvm:页类型;resident:bitmap表,用于表示哪个cache line block已经加载到内存,1表示加载,0表示未加载。dirty:表示哪个cache line block已经变脏,1表示脏,0表示未修改。pId:页号?,r:?,d:?
Mini page
ache line grained page通过仅加载需要的cache line减小带宽消耗。然而,页面在内存中仍然是页大小,消耗DRAM大小并没减少。本文又提出一种页结构min page。在内存中页面没有空洞。页头信息新增count:表示该页面内存中有几个cache line;slot数组用来实现间接寻址,存储物理cache line ID。元组在内存中连续。Full:比如图4,当前mini page有16个cache line,cache line“San Francisco”是物理页第255个cache line,加载到内存中的第3个,即slot为2,因此slot数组中存储:位置2对应索引255。当都用完时,需要申请一个full page,而full字段存储指向full page的指针;然后将mini page中内容拷贝到full page;最后buffer管理器的page map表更新指向full page。
通过函数 void* MakeResident(Page *p, int offset, int n)访问页内数据:Page *p为入参(物理页?)返回内存中指定offset位置开始n个字节。
Full page情况:指定的cache lines已加载,返回cache lines的指针。
Mini page:检索请求cache line的slots,如果没有在内存,则加载到内存,然后添加到slot array。否则返回cache line上offset的指针。
这个函数需要保证,返回的内存是连续的。
Pointer swizzling
使用物理指针替代页号。par:8个字节,存储父节点指针;cnt:swizzled页个数。Swizzled leaf页即PID为7的页替换出内存时:通过par定位到父节点,将父节点的cnt减去1,将ptr重新替换成页号。通过off域找到指针位置?
三层管理机制
SSD存储冷数据。只在DRAM中访问(读写)数据页,通过WAL日志确保持久性,当DRAM中数据页被驱逐时,根据数据冷热程度要么写入NVM,要么写入SSD。
也需要类似DRAM中的页表定位NVM中页。为减小消耗,将这些两个页表合并成一个。
1)初始时页都在SSD上,当一个事务访问这个页时,以页为单位整体加载到DRAM中,不需要写入NVM。
2)只有从DRAM驱逐时才会写入NVM。NVM数据页加载到DRAM可使用cache line page结构。
3)当DRAM没有空闲slot时需要驱逐数据页,为新页腾出空间。首先执行DRAM驱逐,保持最热数据在DRAM,采用clock算法选择哪个数据页被替换。DRAM中选中被驱逐页,且该页不在NVM,那么进入NVM admission阶段。通过admission set定位最近访问的数据页,判断页是否进入NVM:
4)检查该页是否在队列中,若在则从set中删除并写入NVM。
5)否则,将其加到set中,页只在SSD中
6)第三阶段,将NVM中页驱逐并写入SSD。同样适用clock算法。
组合页表
地址字段同样可以存储nvm中地址,这样可以通过该指针直接访问NVM中数据页。该页表在DRAM中,系统重启后需要重构,通过遍历NVM中所有数据页进行重构。
三、原文及参考
Managing Non-Volatile Memory in Database Systems
https://www.researchgate.net/publication/325373187_Managing_Non-Volatile_Memory_in_Database_Systems
https://blog.csdn.net/u013129143/article/details/83829600