bpftime

bpftime

用户态eBPF运行时实现高性能Uprobe和系统调用钩子

bpftime是一个功能完善的eBPF用户态运行时,提供高性能的Uprobe和系统调用钩子。其用户态Uprobe较内核Uprobe快10倍,能安全高效地钩住进程的所有系统调用。该项目兼容现有eBPF工具链,支持跨平台JIT编译,可动态注入运行中的进程,并能与内核eBPF协作。bpftime为系统监控和性能分析提供了强大支持。

eBPFbpftimeUprobe系统调用钩子用户空间运行时Github开源项目

bpftime:快速用户空间Uprobe和系统调用钩子及扩展的eBPF运行时

构建和测试VM 构建和测试运行时 DOI

bpftime是一个功能齐全、高性能的用户空间eBPF运行时。它提供快速的Uprobe和系统调用钩子功能:用户空间uprobe比内核uprobe快10倍!并且可以安全高效地以编程方式钩住进程的所有系统调用

📦 主要特性
🔨 快速开始
🔌 示例和用例
⌨️ Linux Plumbers 23演讲
📖 幻灯片
📚 Arxiv预印本

查看我们在eunomia.dev上的文档!

主要特性

  • 基于二进制重写的Uprobe和系统调用钩子:在用户空间运行eBPF程序,将它们附加到Uprobe和系统调用跟踪点:**无需手动插桩或重启!**可以安全高效地使用eBPF用户空间运行时来跟踪改变函数的执行,钩住过滤进程的所有系统调用。
  • 性能:与内核uprobe和uretprobe相比,Uprobe开销最高可提升10倍
  • 进程间eBPF映射:在共享用户空间内存中实现用户空间eBPF映射,用于汇总聚合或控制平面通信。
  • 兼容性:使用clang和libbpf等现有eBPF工具链开发用户空间eBPF,无需任何修改。支持通过BTF实现CO-RE,并提供用户空间主机函数访问。
  • JIT支持:受益于跨平台eBPF解释器和由LLVM驱动的高速JIT/AOT编译器。还包括用C语言手工制作的x86 JIT,适用于资源受限的环境。VM可以像ubpf一样构建为独立库
  • 无需插桩:可以将eBPF运行时注入到任何正在运行的进程中,无需重启或手动重新编译。
  • 与内核eBPF一起运行:可以从内核加载用户空间eBPF,并使用内核eBPF映射与内核eBPF程序(如kprobe和网络过滤器)协作。

组件

  • vm:eBPF VM和JIT,您可以选择bpftime LLVM JIT和基于ubpf的简单JIT/解释器。它可以构建为独立库并集成到其他项目中。API类似于ubpf。
  • runtime:eBPF的用户空间运行时,包括系统调用服务器和代理、将eBPF程序附加到Uprobe和系统调用跟踪点,以及共享内存中的eBPF映射。
  • daemon:一个守护进程,使用户空间eBPF能够与内核配合工作并与内核uprobe兼容。监控和修改内核eBPF事件和系统调用,从内核加载用户空间eBPF。

快速开始

使用bpftime,您可以使用熟悉的工具(如clang和libbpf)构建eBPF应用程序,并在用户空间执行它们。例如,malloc eBPF程序使用uprobe跟踪malloc调用,并使用哈希映射聚合计数。

您可以参考eunomia.dev/bpftime/documents/build-and-test了解如何构建项目,或使用来自GitHub packages的容器镜像。

要开始,您可以构建并运行一个基于libbpf的eBPF程序,从bpftime cli开始:

make -C example/malloc # 构建eBPF程序示例 bpftime load ./example/malloc/malloc

在另一个shell中,运行带有eBPF的目标程序:

$ bpftime start ./example/malloc/victim Hello malloc! malloc called from pid 250215 continue malloc... malloc called from pid 250215

您还可以动态地将eBPF程序附加到正在运行的进程:

$ ./example/malloc/victim & echo $! # pid是101771 [1] 101771 101771 continue malloc... continue malloc...

然后附加到它:

$ sudo bpftime attach 101771 # 您可能需要以root身份运行make install Inject: "/root/.bpftime/libbpftime-agent.so" Successfully injected. ID: 1

您可以看到原始程序的输出:

$ bpftime load ./example/malloc/malloc ... 12:44:35 pid=247299 malloc calls: 10 pid=247322 malloc calls: 10

或者,您也可以直接在内核eBPF中运行我们的示例eBPF程序,以查看类似的输出。这可以作为bpftime如何与内核eBPF兼容工作的示例。

$ sudo example/malloc/malloc 15:38:05 pid=30415 malloc calls: 1079 pid=30393 malloc calls: 203 pid=29882 malloc calls: 1076 pid=34809 malloc calls: 8

有关更多详细信息,请参阅eunomia.dev/bpftime/documents/usage

示例和用例

⚠️ 注意bpftime正在积极开发中,尚不建议用于生产环境。有关详细信息,请参阅我们的路线图。我们非常希望听到您的反馈和建议!请随时开启问题或联系我们

有关更多示例和详细信息,请参阅eunomia.dev/bpftime/documents/examples/网页。

示例包括:

深入探讨

工作原理

bpftime支持两种模式:

仅在用户空间运行

左:原始内核eBPF | 右:bpftime

工作原理

在此模式下,bpftime可以在没有内核的用户空间运行eBPF程序,因此可以移植到低版本的Linux甚至其他系统,并且无需root权限即可运行。它依赖于用户空间验证器来确保eBPF程序的安全性。

与内核eBPF一起运行

documents/bpftime-kernel.png

在此模式下,bpftime可以与内核eBPF一起运行。它可以从内核加载eBPF程序,并使用内核eBPF映射与内核eBPF程序(如kprobes和网络过滤器)协作。

插桩实现

当前的钩子实现基于二进制重写,底层技术受到以下启发:

  • 用户空间函数钩子:frida-gum
  • 系统调用钩子:zpolinepmem/syscall_intercept。 这个钩子可以很容易地替换为其他DBI方法或框架,或者在未来添加更多的钩子机制。

有关详细信息,请参阅我们的草稿arxiv论文bpftime: 用于Uprobe、系统调用和内核-用户交互的用户空间eBPF运行时

性能基准测试

用户空间uprobe与内核uprobes相比性能如何?

探针/跟踪点类型内核(纳秒)用户空间(纳秒)
Uprobe3224.172760314.569110
Uretprobe3996.799580381.270270
系统调用跟踪点151.82801232.57691
手动插桩不可用110.008430

它可以像内核uprobe一样附加到正在运行的进程中的函数上。

LLVM JIT/AOT与其他eBPF用户空间运行时、原生代码或wasm运行时相比性能如何?

LLVM jit基准测试

在所有测试中,bpftime的LLVM JIT始终展示出卓越的性能。它们在整数计算(如log2_int所示)、复杂数学运算(如prime所示)和内存操作(如memcpy和strcmp所示)方面都表现出很高的效率。虽然它们在整体性能上领先,但每个运行时都有其独特的优势和劣势。这些洞察对用户在为特定用例选择最合适的运行时时非常有价值。

有关我们如何评估和详细信息,请参见github.com/eunomia-bpf/bpf-benchmark

哈希映射或环形缓冲区与内核相比(待完成)

有关详细的性能基准测试,请参见benchmark目录。

与内核eBPF运行时比较

  • bpftime允许您使用clanglibbpf构建eBPF程序,并直接在此运行时中运行它们。我们已经用third_party/libbpf中的libbpf版本进行了测试。不需要特定的libbpf或clang版本。
  • 某些内核辅助函数和kfuncs可能在用户空间不可用。
  • 它不支持直接访问内核数据结构或函数,如task_struct

有关更多详细信息,请参阅eunomia.dev/bpftime/documents/available-features

构建和测试

有关详细信息,请参阅eunomia.dev/bpftime/documents/build-and-test

路线图

bpftime正在不断发展,未来还有更多功能:

  • 基于LLVM的eBPF AOT编译器。
  • 更多示例和用例:
    • 用户空间eBPF网络
    • 热补丁用户空间应用程序
    • 错误注入和过滤系统调用
    • 热补丁并使用iouring批处理系统调用
    • 等等...
  • 更多映射类型和分布式映射支持。
  • 更多程序类型支持。

敬请期待这个前景广阔的项目的更多发展!您可以在GitHub上找到bpftime

许可证

本项目采用MIT许可证。

联系和引用

有任何问题或对未来发展的建议吗?欢迎开issue或联系 yunwei356@gmail.com

我们的arxiv预印本:https://arxiv.org/abs/2311.07923

@misc{zheng2023bpftime, title={bpftime: userspace eBPF Runtime for Uprobe, Syscall and Kernel-User Interactions}, author={Yusheng Zheng and Tong Yu and Yiwei Yang and Yanpeng Hu and XiaoZheng Lai and Andrew Quinn}, year={2023}, eprint={2311.07923}, archivePrefix={arXiv}, primaryClass={cs.OS} }

致谢

eunomia-bpf社区由中国科学院软件研究所PLCT实验室赞助。

感谢其他赞助商和讨论帮助构建这个项目:来自帝国理工学院的Marios Kogias教授,来自华南理工大学的赖晓铮教授,来自西安邮电大学的陈立军教授,来自清华大学NISL实验室李琦教授,以及LPC 23 eBPF赛道的Linux eBPF维护者们。

编辑推荐精选

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
商汤小浣熊

商汤小浣熊

最强AI数据分析助手

小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。

imini AI

imini AI

像人一样思考的AI智能体

imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

下拉加载更多