抽时间调研了一下NoveLSM,总结如下:
NoveLSM核心就是利用Nonvolatile Memory设备解决LSM面临的核心问题:写放大以及写放大的带来的操作的 latency 上升。
NoveLSM解决思路包括如下几个方面(其中一部分是解决老问题引入新问题以及解决办法)。
1. 减少memtable到SST的序列化反序列化开销。
NoveLSM团队直接开发了基于NVM的可持久化的skip list,因此从memtable到NVM避免了序列化和反序列化。
2. 减少 Compaction 的开销
compaction开销是导致写延迟的罪魁祸首,NoveLSM的做法是发现compaction来不及的时候,memtable的数据直接写入NVM中,因为NVM相比内存要大很多,这要本质上是增加了一层持久化缓存,这样也引入新问题,本来LSM的架构是memtable+SST,现在变成了memtable+NVM table+SST。因此read的流程就要响应的调整。
3. 减少 Logging 的开销
LSM的memtable一般都需要WAL用于recover,对于NVM本身就是非易失设备,可以免去WAL。相应的recover的时候,对于NVM table,直接把这个当作WAL看待就可以了。
补充一点,就是增大memtable主要是为了提升写的性能,降低compaction的影响,但是也带来了recover的耗时比较长的问题,同时内存资源也比较宝贵,因此综合起来logging开销不可忽视。
4. 支持并发读取
NoveLSM引入NVM减少compaction,带来了LSM层级的增加,导致原来的read流程的延时会进一步增加,因此NoveLSM采用并发读取的方式降低read的延时,这样 read latency 从通常的T-MemDRAM + T-MemNVM + T-Imm + T-SST变成了max(T-MemDRAM + T-MemNVM, T-Imm, T-SST)。
T-MemDRAMT-MemNVM是 DRAM 和 NVM memtable 的时间开销。
T-Imm则是 immutable memtable 的开销。
T-SST 就是 SST 的开销。
在read的正确性方面,NoveLSM通过增加一些约束来保证。
a. 在上一层的结果未返回之前,下一层的结果不能作为最终结果。
b. 如果某一层返回了结果,那么之后层级的结果忽略,即不会等待后面层级的结果。
优化之后的效果还是比较明显。论文中贴出了对比测试数据
网友评论