在不久的将来,数据库系统有望通过新兴的eBPF技术实现性能上的显著提升。
虽然eBPF最初是为内核数据包过滤而创建的,但研究人员已发现这项技术的其他潜在用途,它提供了一个沙箱化的执行环境,用于在内核本身直接运行的事件驱动程序。其中的一种用途是可以在操作系统周围重新路由数据库操作,而长期以来一直是数据库的瓶颈问题。
卡内基梅隆大学副教授 Andy Pavlo 在本周早些时候举行的 ScyllaDB 的 P99 CONF 上表示:“在过去50年中,操作系统给数据库工程师带来了诸多困扰,因为操作系统做出的某些设计选择,会强行将其理念施加于任何用户空间应用程序,比如数据库系统。”在演讲中,Pavlo 介绍了 BPF-DB,这是一种内存键值数据存储,可以通过 eBPF 植入操作系统内核本身,从而绕过操作系统用户空间(或程序通常运行的内存空间)的限制和局限。Pavlo 说:“因为我们不必将内容复制到用户空间,所以速度要快得多。”该项目背后的研究团队计划在新年将代码作为开源发布,与即将发表的论文一起发布。
数据库 vs 操作系统
在管理计算机资源时,操作系统需确定如何在众多竞争的应用程序间分配资源,但并非每个应用程序都能获取到所需的内存和处理能力。这一直是数据库设计人员的痛点,因为在他们看来,数据库往往是操作系统运行的最关键的应用程序(有时确实如此)。
“操作系统只想摧毁数据库的精神,并将钢铁意志强加于数据库。” —— Andy PavloPostgreSQL 创始人 Michael Stonebraker 在 1991 年写道:“归根结底,许多现有系统中的操作系统服务要么太慢,要么并不合适”。Pavlo指出,操作系统人员对数据库人员也颇有微词,并提到首席Linux内核维护者Linus Torvalds曾开玩笑说数据库人员“品位欠佳”,还抱怨他不得不在ASYNC I/O内核API上做工作,而这个API似乎仅被数据库设计人员用于非阻塞数据写入。
数据库系统充斥着各种变通方法,例如内存管理,以应对操作系统的限制。“选择你最喜欢的系统,那里可能有类似的东西。”Pavlo说。因此,尽可能减少系统调用次数和其他技术,以及尽可能少地与内核交互,自然就成了研究构建更快数据库系统的发展方向。
一种早期方法是采用内核旁路技术,该技术将许多原本由内核处理的功能转移到数据库系统中,通常由英特尔的DPDK和SPDK等库处理。Pavlo表示,这种方法有其局限性。这种方法需要大量重复工作,调试可能很麻烦(ScyllaDB提供DPDK作为选项)。
绕过用户态
研究团队的BPF-DB采取了截然不同的方法,将数据库系统置于操作系统内部。数据库逻辑直接在内核中处理数据,而非将数据复制到用户空间供数据库系统逻辑处理,从而大幅消除了数据复制的开销。“不是把DBMS数据拉到用户空间,而是把DBMS逻辑推到内核空间。”Pavlo说道。
eBPF 提供了实现这一目标的秘诀。它允许用户使用 eBPF 库编写事件驱动程序,这些程序在内核空间本身中执行,并且可以通过跟踪点或中断从应用程序内部调用。通过这种方法,内核本身就可以执行最频繁的数据库操作。
数据库用户无需单独连接到数据库系统本身,而是可以将其请求路由到内核中的代理,该代理将数据库更改批量处理并写入数据库。“这大大减轻了数据库系统的压力。”Pavlo说道,“因为我们无需承担将数据上传到用户空间的开销,从而能够实现更优的性能。”
Pavlo还提到,有些操作仍然必须在用户空间完成,例如密码验证。五年前构建这种eBPF程序是不可行的,但自那时以来,eBPF应用程序二进制接口(ABI)已经变得更加丰富和完善。
BPF-DB介绍
BPF-DB是一个完全事务性的数据存储,可以作为后端数据库(如Redis)的前端使用(“你可以把它看作是eBPF版的RocksDB”,Pavlo说)。它配备了一组可通过API访问的数据库操作符(BEGIN、SET、GET、COMMIT),并且数据存储在内核中的哈希表里。之后,数据会被推送到用户空间,以便提交到长期存储中。
在早期测试中,研究团队发现 BPF-DB 的吞吐量(每秒操作数)是 Redis 的两倍,与高性能 Redis 克隆版 Dragonfly 相当,同时还提供完整的事务功能。延迟也低于 Redis 和 Dragonfly。
“我们确实认为eBPF是摆脱操作系统中问题设计选择束缚的关键所在,它使我们能够将更多的复杂性注入内核,以实现我们所期望的功能。”Pavlo说道。
免费下载/在线试用:
公众号:DBdoctor
如果您是开发或DBA欢迎关注公众号,关注公众号回复:“进群”,可拉您进入技术交流群