一句话:提出 MioDB:以持久化跳表和四项 NVM 优化重构 LSM-tree KV 存储,显著降低延迟、写放大并提升写吞吐。
本文针对基于 LSM-tree 的 KV 存储在字节寻址非易失内存(NVM)上的瓶颈:内存与存储间序列化/反序列化开销,以及刷盘与压缩速度不匹配导致的写停顿和写放大。作者提出 MioDB,用字节寻址持久化跳表替代 LSM-tree 磁盘结构,并设计一键式刷盘、多级弹性 NVM 缓冲与零拷贝压缩、跨层并行压缩,以及加深 LSM-tree 并利用布隆过滤器优化读性能。实验显示,相比 NoveLSM 和 MatrixKV,MioDB 的 99.9 分位延迟降低 17.1×/21.7×,随机写吞吐提升 8.3×/2.5×,写放大最多降低 5×/4.9×。
We present MioDB, a novel LSM-tree based key-value (KV) store system designed to fully exploit the advantages of byte-addressable non-volatile memories (NVMs). Our experimental studies reveal that the performance bottleneck of LSM-tree based KV stores using NVMs mainly stems from (1) costly data serialization/deserialization across memory and storage, and (2) unbalanced speed between memory-to-disk data flushing and on-disk data compaction. They may cause unpredictable performance degradation due to write stalls and write amplification. To address these problems, we advocate byte-addressable and persistent skip lists to replace the on-disk data structure of LSM-tree, and design four novel techniques to make the best use of fast NVMs. First, we propose one-piece flushing to minimize the cost of data serialization from DRAM to NVM. Second, we exploit an elastic NVM buffer with multiple levels and zero-copy compaction to eliminate write stalls and reduce write amplification. Third, we propose parallel compaction to orchestrate data flushing and compactions across all levels of LSM-trees. Finally, MioDB increases the depth of LSM-tree and exploits bloom filters to improve the read performance. Our extensive experimental studies demonstrate that MioDB achieves 17.1× and 21.7× lower 99.9th percentile latency, 8.3× and 2.5× higher random write throughput, and up to 5× and 4.9× lower write amplification compared with the state-of-the-art NoveLSM and MatrixKV, respectively.
@inproceedings{paperbot9998,
title = {Revisiting Log-Structured Merging for KV Stores in Hybrid Memory Systems},
author = {Zhuohui Duan and Jiabo Yao and Haikun Liu and Xiaofei Liao and Hai Jin and Yu Zhang},
booktitle = {ASPLOS},
year = {2023},
doi = {10.1145/3575693.3575715}
}