问题引出
传统的架构都随着DATA size的增大而出现 性能悬崖式下降
2.1 NVM Direct
不同结构的 NVM Direct systems 在这篇论文中有详细的研究
J. Arulraj, A. Pavlo, and S. Dulloor. Let’s talk about storage & recovery methodfor non-volatile memory database systems. In SIGMOD, pages 707–722, 2015.
Their work categorizes database
systems into in-place update, log-structured, and copy-on-write
engines
in-place 性能最高同时对NVM硬件磨损最少,所以他们也用这个算法
直接使用NVM
2.2 Basic NVM Buffer Manager
事务只在DRAM执行
memory is divided into fixed-size pages
An NVM-optimized variant
H.Kimura.FOEDUS:OLTPengineforathousandcoresandNVRAM.InSIGMOD, pages691–706,2015.
FOEDUS stores two pointers. One identifies the NVM-
resident copy of the page, the other one (if not null ) the DRAM one.
When a page is not found in DRAM, it is loaded into a buffer pool.
FOEDUS uses an asynchronous process to combine WAL log entries
and merge them into the NVM-resident pages to achieve durability
FOEDUS 中NVM 是用于持久性和cold data的.作者的目的则是想让访问NVM更加频繁…改进BUFFER MANAGER 优化访问NVM
2.3 Recovery
作者并没有对LOGGING做文章,对每个对比的系统都用
We use write ahead logging with redo and undo information
The undo entries enable one to perform rollback and to undo the effect of loser transactions during recovery. The redo entries are used to repeat the effects of committed transactions during recovery if it was not yet persistent
3 NVM BUFFER MANAGEMENT
作者的目标:他们的系统的结构可以 在数据量小的时候 性能跟main-memory database system一样,然后 涉及NVM和SSD的时候性能也不会下降那么多
For this purpose, we design a novel DRAM-resident buffer manager that swaps cache-line-grained data objects between DRAM and NVM
在DRAM的BUFEER管理 管理在DRAM和NVM间交换一个CACHE line 粒度的数据
利用nvm 的可字节寻址可以优化带宽
在这里插入图片描述
红色 hotdata 橘色warmdata 蓝色 colddata
NVM SSD之间 page-grained swap
DRAM NVM之间 cacheline-grained
分配full-page 和mini-page能更好的利用DRAM空间
cold pages中的hot data object 能被抽离(因为是cacheline-grained)
大概是 在拥有大多数cold data的页存到了nvm中 然后把其中的hotdata 通过cache line grained 抽离回DRAM (因为HOTDATA经常用,放在DRAM很快就能访问到) 只当如果mini page满了,他就放到full page
pointer swizzling scheme
3.1 Cache-Line-Grained Pages
因为NVM低延迟,所以才能应用CLG pages . (如果SSD这种高延迟的,就只好通过一个PAGE粒度(16KB)的读取来降低延迟的带来的开销)
buffer manager之前的做法:分配一个pages在DRAM,只有当事务满了一pages才整个存进去
作者的做法:只分配一个pages在DRAM,当一个事务请求放进去,就给他找一个cache line
因为CLG 设计很复杂,而且每个数据必须被清晰标明信息,所以作者只在最有影响的几个地方使用CLG(lookup, insert, and delete)其他就整个PAGE
作者说只有小数据访问 用CLG 会比较好,大数据还是用PAGE比较好…佛了嗷
那你用大PAGE的话,你的MINI PAGE咋办,怎么提取hotdata?
3.2 Mini Page
因为 传统的page设计就是,你即使只想访问DISK的一个元组,我也把整个PAGE LOAD 进DRAM
为了简化访问full pages 和mini page中的一个cache line,用了一个接口(访问就调用这个接口,如果在DRAM就直接返回指针,不在就LOAD IN 然后返回指针)
(When a mini page does not have enough memory left to serve
a request, it is promoted to a full page. 所以有full 这个指针)
P 要找cache line所在的pages, offset偏移, length n
如果p是FULL page,那指定的cache Lines 就load到DRAM 然后返回一个指向这个lines的指针(if not yet resident)
如果p是MINI PAGE那就先看 slots array 如果没有,就从NVM load进DRAM并且修改slots array,返回指针
访问的必须是连续的(也就是说如果要访问两个以上的CACHE LINE,他们必须是连续存储) 所有mini page是顺序的
如果MINI PAGE满了就所有数据复制到一个新分配的FULL PAGE结构,并且buffer manager 加一个指向新FULL PAGE的指针,然后旧的mini page 只清空数据,但是不消除这个表,也不删除buffer manager里指向他的指针
3.3 Pointer Swizzling
we introduce pointer swizzling, a technique that
reduces this overhead (mainly the page table lookup) by dynam-
ically replacing page ids with physical pointers
动态地把Page ids 替换成 直接指向他的指针,这样就能减少查PAGE ID再根据PAGE ID 去找PAGE 的开销
Pointer swizzling has recently been proposed in the context of
traditional buffer managers (DRAM + SSD/HDD) [ 17 ]
一些前提知识
数据在内存 都是 以虚拟地址形式存在
swizzle = replace
Pointer Swizzling = the database addresses in data blocks/records are replaced by virtual memory addresses when the referenced data block/record resides in memory
就是把物理地址替换成内存虚拟地址
Problems created by the Pointer Swizzling technique
1.写回去DB的时候必须把指针恢复成DB物理地址
解决方案:穷举 映射表,或者 用HASH 表
2.想释放一个block 必须先把和他相关联的指针(指向虚拟地址) 恢复成指向物理地址的指针
这些被替换后的指针指向的块 叫做 pinned block 因为,他们只有当指针恢复指向DB物理地址的时候才能 release
解决办法:映射表引入Linked List 指向 指向他的第一个BLOCK
前提知识结束回到这篇论文的 POINTer SWIZZLING
同样的 swizzled leaf是不能直接swap out的
首先是修改父节点的cnt -1,然后把指针修改成PID
4 THREE-TIER BUFFER MANAGEMENT
再加一个SSD
这不会加快速度,但是增加数据存储量
现实中的数据都是hot data cold data 夹杂一起,所以要把少量Hot data放在DRAM ,COLD data放到别的地方, 而NVM的容量有限,如果采用大容量的NVM ,经济开销很大,所以引入SSD.
Our layered approach solves this problem by providing close to
main memory speed for the hot data (provided it fits into DRAM)
while also supporting cheap SSD storage for cold data in a single
system
4.2 repalce Strategies
有两个buffer pools (DRAM 和 NVM)
Combined Page Table
如果工作量可以在NVM里执行,那么第三层SSD ,就可以不使用了,.所以作者在BUFFER MANAGER中 指向DRAM 或者指向NVM
然后DRAM的PAGE头文件再加一个指针 指向NVM
The page mapping table is performance critical and is therefore
stored in DRAM.
重启的时候需要扫描整个NVM page 来建立这张表 到DRAM 中,所以需要等待一点时间才能开始进行事务…(在慢的硬件实行不了这个东西例如FLASH,NVM可以)
Reading the page identifiers for 100 GB
of NVM takes slightly less than 1 second
总结一下
他们的BUFFER MANAGER
1初始dram中仅仅有个空白nvm page指针,指向nvm相应的page,但是没有数据,事务来了再去检索nvm 相应page 的相应cache line,所以要有resident信息,dirty信息用来到时候writeback, NVM指针用来按需的取cache line,(16kb的page 有256个cache lien)
2.mini page中的slots指示cache line在nvm的位置
http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/2-disks/pointer-swizzling.html