LevelDB引入SPDK记录

SPDK提供了用户态nvmeSSD驱动,通过避免内核陷入和轮询等特性来提高IO性能 SPDK中提供了RocksDB的接口文件,我们可以参考着给LevelDB使用。

此处用到的SPDK接口基于blobfs,参考上面这张图


下面列一下我是怎么配置滴

设置块设备

spdk需要nvme裸块,已在使用 的设备先umount,注意数据备份
umount /mountdir

然后再格式化,我这里块号是nvme0n1
nvme format /dev/nvme0n1


关于SPDK环境预配置

内核驱动解绑,由uio or vfio 交接

spdk采用了大页内存,在使用前需要分配,这里可以定制化,不需要的话默认就行

./spdk/setup.h完成


接口改造

这里还是主要参考了env_posix,我们自己加一个env_spdk文件,设计SpdkEnv继承env基类,利用RAII做blobfs的安装与卸载

blobfs更接近于对blob对象的管理模块,缺失了许多文件系统的特性。比如层级目录,目前简单的采用了前缀添加目录名的方法来模拟目录,此处可以优化。

然后将文件接口全部用blobfs的读写接口替换掉

日志模块,加入了spdkfile的私有变量,也改造成了spdk模式。正常运行时只需要写,快了很多。

env单例,posix_env中由于不需要卸载工作使用了单例,这里也做了改造,使其可以正常析构卸载

停止工作线程,同上理由,在需要卸载时将阻塞的工作线程全部释放

启动工作这里需要注意,blob cache不能太小了,遇到很大的blob就会报错。内部cache获取的方法,在看了源码后发现是直接尝试分配100次,都失败就直接中止程序。小于20%会落盘一些低优先级的blob,优先级只给了两个级。 进一步优化,spdk很多接口都提供了异步和同步的两个版本,可以考虑采取异步接口来加快一些。

(ps:SPDK源码里面同步接口也是拿异步的方式来实现的,内部利用信号量来同步)

编译

这里注意,spdk不同版本对于的许多库会有增加和缺失、而且很多,不建议手动写死(很容易构建失败,新拉取的一版spdk就出现了库不匹配的问题),外部构建采用pkgconfig动态取依赖库(用法见makefile or shell手动提库)动态库在SPDK编译时需要指定configuration生成,否则只有静态库给你用。 spdk还依赖的dpdk的一些组件,在外部构建时也需要加入。

测试结果

简单看看测试结果。

(disk:sata接口的普通机械盘)

可见在写模式下,spdk拥有很好的表现,然而读模式不及改造前。非常适合在追加写场景使用spdk。但是readrandom发现非常地差! ε=( o`ω′)ノ我们后面来看看原因


spdk随机读缓慢分析

在db_bench测试下的当前表现

  1. readseq略慢于其他类型

  2. readrandom极慢,耗时是其他类型的若干倍

当前的情报

  1. 相关资料研究发现Spdk blobfs在read random下不如内核态,大致区间在100%~120%内
  2. spdk内部可以调整blob缓存池大小

暂定研究leveldb内部的cache机制和blobfs的cache机制

测试发现,大部分耗时集中在了SpdkRandomAccessFile::Read()中,此方法调用了blobfs的file_read方法。而且,调整fs cache大小没明显变化。

解决

原因有可能并非cache size的问题..(・∀・(・∀・(・∀・*)

SPDK blobfs自带file cache,而cache实现机制类似B+tree,每个叶子节点有一个固定大小的cache buffer。blobfs默认给定buffer大小不够大,导致读一次文件可能需要多次寻找buffer。这里将buffer修改至2MB,这符合了默认SST文件的大小,发现结果变得理想了,以下为重新编译SPDK的测试结果:

完美的提升, (^_^)~~


相关推荐
Zane199425 分钟前
调用了 async 函数却没执行?一文讲透协程、event loop 与 await
后端·python
Zane199429 分钟前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
掘金者阿豪1 小时前
若依启动突然报 Redis MISCONF?一次从应用报错到磁盘爆满的完整排查记录
后端
boooooooom2 小时前
尝尝咸淡:从朴素 RAG 到 Graph RAG——一个烹饪问答系统的三层检索升级之路
前端·后端·llm
2601_963870183 小时前
【计算机毕业设计】基于Vue+Spring Boot的助农电商系统的设计与实现
spring boot·后端·课程设计
sun༒3 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
yuhaiqiang3 小时前
从这两件事就能看出 vibecoding 距离专业作品差距有多大?AI 能抹平技术,但抹不平品味 !
前端·后端·程序员
野生技术架构师4 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
明月_清风5 小时前
vLLM 深度实战:2026 年生产级 LLM 推理引擎完全指南
前端·后端·ai编程