本研究的作者为Gabriel Haas和Viktor Leis,均来自德国Technische Universität München(慕尼黑工业大学)。
研究成果发表于PVLDB (Proceedings of the VLDB Endowment) 期刊2023年第16卷第9期(页码2090–2102),标题为《What Modern NVMe Storage Can Do, and How to Exploit It: High-Performance I/O for High-Performance Storage Engines》。
本研究属于数据库存储引擎优化领域,聚焦于如何充分利用现代NVMe SSD(Non-Volatile Memory Express Solid State Drive,非易失性内存快速固态硬盘)的硬件性能,以解决存储引擎与硬件之间的性能鸿沟问题。
近年来,NVMe SSD因其低成本和高吞吐量成为数据库系统的首选持久化存储介质。单块NVMe SSD可支持每秒超过100万次随机I/O操作(IOPS),多块组合后可达千万级IOPS。然而,现有数据库系统(如RocksDB、WiredTiger等)的存储引擎设计仍基于传统磁盘架构,未能充分发挥NVMe SSD的性能潜力。例如,实验显示,在8块三星PM1733 SSD组成的阵列上,现有系统仅能达到硬件理论性能的1/3(3.6M IOPS vs. 12M IOPS)。
本研究旨在解决以下核心问题:
1. 如何设计存储引擎以匹配NVMe SSD的硬件性能?
2. 如何优化I/O接口(如选择libaio、io_uring或内核旁路方案SPDK)?
3. 如何平衡页面大小(Page Size)与I/O放大(I/O Amplification)的关系?
4. 如何管理高并行I/O请求以实现SSD带宽饱和?
研究者通过微基准测试量化了NVMe SSD的性能特征,包括:
- 驱动器扩展性:8块SSD组成的阵列在4KB随机读取场景下实现12.5M IOPS,验证了硬件规格的可靠性。
- 读写混合影响:写入操作显著降低吞吐量(纯写入仅4.7M IOPS,而10%写入占比时降至8.9M IOPS)。
- 页面大小选择:4KB页面对随机读取的IOPS(每秒输入/输出操作数)、延迟(Latency)和带宽(Bandwidth)最优,比16KB页面性能提升4倍。
对比了四种Linux I/O接口的效率和适用场景:
- 阻塞式POSIX接口(如pread):单线程性能受限,无法满足高并发需求。
- 异步接口(libaio、io_uring):通过批量提交请求减少上下文切换,但内核开销仍显著。
- 用户态I/O(SPDK):绕过内核直接访问NVMe队列,仅需3个CPU核心即可饱和SSD带宽,但需独占设备访问权限。
基于开源存储引擎LeanStore(原设计针对SSD优化但仍有性能瓶颈),研究者提出以下改进:
- 轻量级任务调度:用协程(Boost Context库实现)替代传统线程,减少上下文切换开销。单个任务切换仅需20 CPU周期,而内核线程切换需数千周期。
- 统一I/O抽象层:支持多SSD的RAID 0逻辑聚合,避免Linux软件RAID的性能损耗。
- 无锁数据结构和分区化锁:消除全局锁热点,提升多核扩展性。
在64核AMD服务器(8×三星PM1733 SSD)上测试了优化后的LeanStore性能:
- TPC-C基准测试:数据集10倍于内存时,事务吞吐量达1.07M TPS(Transactions Per Second,每秒事务数),较RocksDB(10K TPS)和WiredTiger(40K TPS)提升两个数量级。
- 随机读取测试:实现13.2M次查询/秒,匹配硬件极限性能。
本研究系统化地解决了存储引擎与NVMe硬件间的性能失配问题,提出了一套可复用的设计原则:
1. 小页面(4KB):平衡I/O放大与SSD内部并行性。
2. 用户态调度:协程替代线程避免操作系统开销。
3. 全栈优化:从算法(如无锁分区)到硬件接口(如SPDK)的协同设计。
研究开源了代码(GitHub仓库leanstore/leanstore),并指出未来PCIe 5.0 SSD需要更高效的CPU利用率,暗示内核I/O栈(如io_uring)需进一步优化以追赶硬件发展。