SIGMOD25论文阅读:BPF-DB:——A Kernel-Embedded Transactional Database Management System For eBPF Applications
文章地址:https://dl.acm.org/doi/10.1145/3725272
Andy的演讲视频:P99 CONF 2024 | The Next Chapter in the Sordid Love/Hate Relationship Btwn DBs & OSes by Andy Pavlo
该文章发表于SIGMOD 2025,出自CMU的Andy团队,搞项目通过JIT生成eBPF代码实现了嵌入式KV数据库
技术背景
内核旁路(Kernel-Bypass) 是一种高性能网络数据处理技术,主要应用于 DPDK、RDMA 和 eBPF 等系统 I/O 密集型场景。这些方案通过绕过传统内核网络协议栈冗长的处理流程,从而显著提升了数据转发效率。在基于内核的传输过程中,中断处理、内存拷贝、上下文切换、缓存局部性失效以及内存管理等机制,在高并发场景下会形成严重的性能瓶颈。而 Kernel-Bypass 方案直接让应用程序与硬件交互,从而避免了这些开销。
而eBPF(extended Berkeley Packet Filter)是一种用于在操作系统内核中以安全、高效方式运行用户定义程序的虚拟机,主要用于网络包在内核中的事件与监测。由于eBPF 程序是在内核态执行的,它需要在执行前经过内核的严格验证器(verifier)检查,确保 eBPF 程序不会导致内核崩溃或出现其他安全问题。验证器会检查 eBPF 程序的执行路径是否是安全的,避免无限循环、非法内存访问。验证通过后,将会把eBPF字节码送入eBPF虚拟机中运行。
实现细节
使用eBPF实现KV数据库的核心和关键是eBPF Maps结构,该结构用于用户态(User-space)和内核空间(kernel-space)的数据交互。
Linux内核规定了Key大小最大512字节,value大小最大4096字节(4KB),所以BPF-DB虽然实现了KV数据库,但对value的大小进行了限制:value的最大值不能超过1KB
BPF-DB的核心功能放在内核空间(kernel-space)中实现,从而减少了因为Kernel-space和User space交互带来的性能损失。
且受益于Kernel-Bypass的特性,BPF-DB还可以直接通过Linux内核中的网络堆栈进行网络通信,从而减少了因为网络通信带来的延迟
实验结果
BPF-DB基于MVCC实现了事务机制,仅在p99的情况(长尾延迟,99%的请快,仅1%慢)会发生显著提高,这部分是因为版本链扫描开销,GC开销,锁冲突加剧造成
BPF-DB具备良好的可扩展性(Scalability),吞吐量(Throughput)随着线程数量增长,呈现对数增长的趋势
在上述机制的实现下,相比较于Redis有大幅度性能提升
结语
Andy在Kernel-Bypass这件事情上非常执着,无论是在CMU15-721的课上还是对外的演讲上,都一再强调数据库不应当依赖操作系统的机制,而应该独立掌控关于内存与硬盘存储的控制,于是CMU数据库组就有了关于在数据库中使用Kernel-Bypass的研究,而这篇文章也确实给在Linux内核中开发数据库的想法,提供了很不错的思路
而美中不足的地方在于,eBPF的存储限制其实很多,而且其程序不能申请栈内存,不能直接传递引用、指针,不支持递归数据结构,也不能动态分配内存。Andy虽然想要在eBPF中实现SQL,但是实现难度应该要比想象的要大。