KAML: A Flexible, High-Performance Key-Value SSD
Yanqin Jin 加利福尼亚大学,北卡罗来纳州立大学
摘要:现代ssd只开放给主机程序一个块io的接口,资源没有充分利用。有很多尝试去用针对键值的接口以及内部的事务机制实现提升,但实现的并不好。KAML:key-addressable,multi-log。将数据存储为变长记录而不是固定记录。同时,暴露一个kv的接口可以减少应用与ssd之间的导向层。KAML也提供了内部事务支持,适应细粒度的锁而不是之前的page-level的锁。KAML包括了与pagecache相似的缓存层,利用了主机内存。
性能指标:与现存的kv存储相比,OLTP(在线事务处理)提高了1.1x-4x。
introduction:
现存kv接口的提议的问题:
1、对ssd内部所有kv对提供单一,共享的映射,使得所有应用的kv映射都必须使用一致的策略。
2.这个策略止于ssd,而没有考虑其他的存储设备。尤其是,不提供缓存功能。
3.在原子写上,他们提供事务的pagelevel的原子更新,与应用需求不符。
KAML要对内部flash存储单元进行管理?那不就做固件去了么。内部多channel的io并行性。
主要工作:在商业可用的ssd参考设计上进行扩展,并实现了主机端的缓存层。
motivation and background:
flash memory and ssd:
闪存的一些用到的特性:
1.read,program,erase粒度不同,延迟不同
read 100微妙,program 100-2000微妙,erase几毫秒。
pe寿命不同,且不能原址更新,所以有了FTL层,从逻辑地址映射到物理地址。其中包括GC,wear level。运行在ssd内部处理器以及DRAM上。
FTL实现:
现代FTL的两个特点,逻辑物理地址映射,gc功能。
每个闪存页有部分叫做OOB(out of band)区域存储映射,gc,纠错的需要的元信息。通常大小在128-256B。
SSD中的事务:
KAML在ssd中提供原生的持久性和原子性。而让应用实现一致性和隔离性。
ssd支持页级别的原子写,COW。
KAML系统实现:
使用新式的FTL设计,提供事务性的,键值接口。
接口提供命名空间概念,可以隔离不同应用。
1.key,value,namespace
key 64byte,value变长,意味着可以存储任何种类的对象。例如,传统的4kB的page文件系统,可以转换成kv形式,地址作为key,4KB的page作为value。
kv接口减少一层映射:key-ppn
传统:key-lba-ppn
2.原子性和持久性
3.细粒度锁
4.缓存层
因为KAML为kv接口,所以需要与之前不一样的缓存设计。而且要实现事物的隔离性。
cache层使用namespaceid和key作为hash的source,寻找是否hit。事务提交时,将cache回写到ssd。
事务管理器一致性使用的是SS2PL(强严格二阶段锁)
XCB(transaction control block)的状态机如下
XCB是事务管理器用来管理事务状态的结构体
KAML实现:
硬件架构:在nvmessd商业开发板上实现了KAML。
命名空间管理:
KAML把每个flashtarget当做一个log。每次put,append到log最后,并更新key与location的映射关系。每个命名空间对应多个log提升了局部性,相应提高了垃圾回收的性能。当然这种对应关系是动态可变的。
每个page分为64个固定的chunk,每个record会记录起始chunk,结束chunk。
映射表:
原始映射表只有一张,无法提供命名空间,而且LBA概念狭隘,只能代表数据的连续block地址空间,无法代表用户的key。