eunomia-bpf 项目重磅开源!eBPF 轻量级开发框架来了

近日,在 2022 云栖大会龙蜥峰会 eBPF & Linux 稳定性专场上,来自 eBPF 技术探索 SIG Maintainer 、浙江大学的郑昱笙分享了《eunomia-bpf:eBPF 轻量级开发框架》技术演讲,以下为本次演讲内容:

大家好!我是来自浙江大学的郑昱笙,今天为大家介绍下 eunomia-bpf 项目作为一个为了简化 eBPF 程序的开发、分发、运行而设计的轻量级 eBPF 开发框架的背景和目标;再通过一些简单的实例,展示一下 eunomia-bpf 是如何从云端一行命令下载运行 eBPF 程序、只编写内核态代码即可运行和导出事件,以及和 WebAssembly 的结合等功能,最后简要阐述一下 eunomia-bpf 的原理和设计实现的思路,探讨一下接下来的发展方向。

eunomia-bpf 项目龙蜥社区开源仓库:https://gitee.com/anolis/eunomia

概要

eunomia-bpf 起源于 2022 年全国大学生操作系统大赛,希望将 eBPF 程序作为服务运行,把 eBPF 程序打包为一个 JSON 对象,通过 HTTP 请求即可动态插拔运行任意一个可重定位的 eBPF 程序,并且可以适应不同内核版本和架构。比赛结束之后,在高校的几位老师和社区中的一些伙伴的帮助和指导下(在这里重点感谢西安邮电大学陈莉君教授及团队和龙蜥社区毛文安老师),逐步把这些想法变成了一个初具雏形的开源项目。

当前,eunomia-bpf 想要解决的问题或 eBPF 程序当前的开发和分发过程中存的痛点主要有以下两个:

第一对于新手而言,搭建和开发 eBPF 程序的门槛较高,不仅需要必须同时关注内核态和用户态两方面的交互和信息处理,还需要编写用户态加载代码。

第二在不同架构的不同内核版本上无法方便快捷地打包、分发、发布各种 eBPF 程序。eBPF 很多小工具由不同的语言开发,存在不同的接口,无法轻易集成到大型的可观测系统。当前没有很好的插件方案,很多时候必须重新编译整个可观测的框架,再重新部署上线,才能更新 eBPF 探针或数据处理模块。另外,如果引入第三方的用户态数据处理代码,代码崩溃会导致整个程序崩溃。

因此,针对上面两个问题,我们提出了三种解决思路:

1.针对初学者,只需要编写内核态代码即可自动获取内核态导出的数据,编译后即可进行加载和运行,降低了 eBPF 的学习成本,提高了开发效率。

2.基于 libbpf一次编译处处运行的特性,将用户态、内核态的编译和运行的完全分离,通过标准 JSON 或 WASM模块的方式进行分发,无需进行重新编译,应用启动占用资源少,时间短,甚至容器启动更短。

  • WebAssembly (缩写 WASM) 是一种基于堆栈虚拟机的二进制格式, WASM 是为了可移植的目标而设计。可作为 C/C+/RUST 等高级语言的编译目标,使客户端和服务器应用程序能够在 Web 上部署。到现在为止, WASM 已经发展成为一个轻量级、高性能、跨平台和多语种的软件沙盒环境,被运用于云原生软件组件,可以在非浏览器环境下运行。 WASM 的设计思路和 eBPF 也有不少相似之处。

3.只编写内核态代码的时候,使用 JSON 即可完成分发、加载、打包的过程,对于完整的、需要用户态和内核态进行交互的 eBPF 应用或工具,可以在 WASM 中编写复杂的用户态处理程序进行控制和处理,并且将编译好的 eBPF 字节码嵌入在 WASM 模块中一同分发,在目标机器上动态加载运行。

  • 和 WASM 生态项结合可以给 eBPF 程序带来许多特性,同时和 eBPF 程序原本的设计思路也不谋而合,比如可移植、隔离性、安全性,它也是一个跨语言、轻量级的运行环境等等。同时也可以借助 WASM 的相关工具完成 eBPF 程序的 OCI 镜像的存储和分发,最近 Docker 官方也推出了一个基于 WASM 的分发工具。

以上三部分就是 eunomia-bpf 的核心特性,接着和大家一起来看一些示例。

示例

eunomia-bpf 并不是一个完整的系统,而是类似于开发库和开发框架,可以很轻松地嵌入 Coolbpf 工具链里,也可以作为开发库或开发框架嵌入其他程序。

可以通过一行命令从网页端直接下载预编译好的 eBPF 程序运行。使用 WebAssembly 或 JSON 模块的方式进行分发,部署时无需重新编译,启动速度很快。eunomia-bpf 适用于通用的、任意类型的 eBPF 程序,不仅局限于 trace 方面的 kprobe、uprobe、fentry 等,也支持如 lsm、tc、xdp 等类型的 eBPF 应用,都只需要编写内核态代码即可完成。

上图中为放入 URL 里的形式,也可以换成 OCI 镜像或 Docker 镜像,可以存储在 Docker 仓库或 github package ,使用方式与 Docker 基本一致,只需简单地执行 pull、run 即可运行,也可以将编译好的程序包 push 下去直接使用。

而相比于传统的 Docker 镜像,它的启动速度更快,同时也保留了 eBPF 很重要的特性,可以轻松嵌入到其他程序作为子模块或插件使用。

通过 eunomia-bpf ,只需编写内核态代码即可正确运行,能够最大程度减少新手的上手障碍,省略了用户态的加载框架编写,能够自动导出内核态 perf event 或 ring buffer 事件。另外,它与和原生 libbpf 完全兼容,可以获取 libbpf tools 的内核态代码,无需修改任何代码,可直接运行。

可以额外添加 tracepoint ,也可以通过注释的形式添加其他内容。使用容器打包编译工具链,无需担心环境配置问题,一行命令生成项目模板、一行命令编译。

一般来说,一个完整的 eBPF 应用程序分为用户空间程序和内核程序两部分,用户空间程序负责加载 BPF 字节码至内核,或负责读取内核回传的统计信息或者事件详情,进行相关的数据处理和控制。

我们可以在 WASM 中编写用户态辅助程序,来完成安全、高效的用户态数据处理和控制逻辑,它同样具备 eBPF 的特性,例如安全性( WASM 和 eBPF 一样也是个沙盒环境,在用户态运行的时候即使 WASM 模块崩溃了,也不会造成宿主程序的异常退出)、可移植性、轻量级、模块化等等,也可以作为插件使用,添加新的数据处理逻辑时,也不需要更改原本的代码。(注意 WASM 是可选而不是必须的,对于一些简单的应用而言,编写内核态代码就足够了)

实际上,我们是用 C 语言编写代码,然后打包生成 WASM 模块,之后我们可以:

  • 借助 WebAssembly 的相关生态帮助分发、管理 eBPF 程序,例如 docker-wasm。
  • 可嵌入大型应用中作为 eBPF 可编程模块或插件使用。

这里演示的是一个简单的 WASM 模块,它可以获取当前系统的进程间的 signal 信号传递的事件,也可以接受一些命令行参数,并且对上报的信息进行处理。

目前来看,我们已经可以基本上不用进行代码修改,就可以直接把 BCC/libbpf-tools 里面的程序编译为 WASM 模块。对开发体验来说,也可以做到和使用 C 语言开发 libbpf 的 eBPF 程序完全相同,之后也可以引入其他的语言开发 SDK。

把 WASM 和 eBPF 结合起来主要的困难在于,WASM 的内存布局和 eBPF 程序并不一样,C 语言的结构体并不能直接映射,所以传递结构体必须要经过序列化操作。同时, WASM 对于访问系统资源,例如文件、网络等等,也有不少限制,很多标准库是缺失的,所以我们需要在 WASM 模块中进行一些特殊的处理和移植。

系统架构

架构底层依赖的是内核态和用户态的基础设施,比如 libbpf 库和 Kernel 中的 eBPF 虚拟机。在内核的基础设施这之上,我们会提供相关的编译工具链,和对应的运行时加载器,帮助生成 JSON 或打包成 WASM 的模块,工具链本身使用了比如 Clang/LLVM、bpftool 等工具。动态加载库可以独立使用,与 WASM 无关,也可以借助动态加载 JSON 配置信息即可热插拔、热更新 eBPF 程序的形式,通过 API 接口轻松实现 kernel function as a service(内核函数即服务)。

我们还实现了 WASM 抽象层,包含 API 规范,比如用于扩展 WASM 的虚拟机 WSAI 系统占用的访问形式或与 eBPF 交互的访问形式。还有基于 WASM 定制的 libbpf 库、移植的辅助态程序以及序列化库等,用于在 WASM 模块加载基于 libbpf 的 eBPF 程序。

运行时库可以轻松进行替换,比如替换成 WSI 的 WASM 运行时。除此之外,上层还在 LMP 项目中,实现了 eBPF hub 等包管理和分发设施,以及其他的命令行工具、可观测性工具等。

目前,eunomia-bpf 项目已在龙蜥社区开源,欢迎各位开发者体验,也欢迎大家提出建议和反馈,一起来做大做强。

相关链接:

eunomia-bpf 项目地址链接:

https://github.com/eunomia-bpf/eunomia-bpf

eBPF技术探索 SIG 地址:

https://openanolis.cn/sig/ebpfresearch

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文看懂分布式链路监控系统

背景 传统的大型单体系统随着业务体量的增大已经很难满足市场对技术的需求,通过对将整块业务系统拆分为多个互联依赖的子系统并针对子系统进行独立优化,能够有效提升整个系统的吞吐量。在进行系统拆分之后,完整的业务事务逻辑所对应的功能会…

深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化

11月3日,2022 杭州 云栖大会上,阿里云智能总裁张建锋表示,以云为核心的新型计算体系正在形成,软件研发范式正在发生新的变革,Serverless 是其中最重要的趋势之一,阿里云将坚定推进核心产品全面 Serverless…

适用场景全新升级!扩展 Dragonfly2 作为分布式缓存系统架构

Dragonfly2 简介 Dragonfly 作为龙蜥社区的镜像加速标准解决方案,是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率,最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。 现阶段 D…

sdut 最长公共子序列问题

Problem Description 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”&a…

hdu1176 免费馅饼 动态规划 二维数组实现

免费馅饼 Time Limit: 1000MS Memory Limit: 32768KBSubmit Statistic DiscussProblem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉&am…

如何通过链路追踪进行定时任务诊断

背景简介 什么是定时任务 定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术方案》。 什么是链路追踪 随着分布式微服务化架构在企业中大规模运用,业务运行的应用平台是一…

关于平台工程的开发者工具链,你还想加点啥?

前言 从 Kubernetes 诞生以来,以 DevOps、容器化、可观测、微服务、Serverless 等技术为代表的云原生,催生了应用架构新一轮的升级。有意思的是,与以往的技术迭代更新不同,原本是一个技术圈常规的一次技术实践,在千行…

阿里云联合“产学研媒”发起 BizDevOps 共促计划,助力企业提升组织效能

2012年全球最具影响力的独立研究咨询机构Forrester曾预言:“In the future, all companies will be software companies”(在未来,所有的企业都将成为软件企业) 近10年来,DevOps运动在全球和中国风起云涌,…

Kubernetes HPA 的三个误区与避坑指南

前言 云计算带来的优势之一便是弹性能力,云原生场景下Kubernetes提供了水平弹性扩容能力(HPA),让应用可以随着实时指标进行扩/缩。然而HPA的实际工作情况可能和我们直观预想的情况是不一样的,这里面存在一些认知误区。…

K8s有损发布问题探究

问题提出 流量有损是在应用发布时的常见问题,其现象通常会反馈到流量监控上,如下图所示,发布过程中服务RT突然升高,造成部分业务响应变慢,给用户的最直观体验就是卡顿;或是请求的500错误数突增&#xff0c…

解读 K8s Pod 的13种典型异常

在K8s中,Pod作为工作负载的运行载体,是最为核心的一个资源对象。Pod具有复杂的生命周期,在其生命周期的每一个阶段,可能发生多种不同的异常情况。K8s作为一个复杂系统,异常诊断往往要求强大的知识和经验储备。结合实战…

实践教程之如何快速使用 PolarDB-X

PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。 本期实验可以让您快…

实践教程之如何将 PolarDB-X 与大数据等系统互通

本期实验将指导您使用PolarDB-XCanalClickHouse搭建实时分析系统。 本期免费实验地址 本期教学视频地址 前置准备 假设已经根据前一讲内容完成了PolarDB-X的搭建部署,可以成功链接上PolarDB-X数据库。 实践教程之如何快速安装部署PolarDB-X 部署Canal Canal是…

加载速度提升 15%,关于 Python 启动加速探索与实践的解析

编者按:在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者严懿宸分享了主题为《Python 启动加速的探索与实践》的技术演讲。本次演讲,作者将从 CPython 社区相关工作、本方案的设计及实现,以及业务层面的集成等方面进行介绍。…

统信软件高级工程师:关于云原生技术在容器方面的应用介绍

编者按:随着近几年来云原生生态的不断壮大,众多企业纷纷开展了用云上云的工作,学习云原生及容器技术对于现代工程师是必不可少的。本文整理自龙蜥大讲堂 54 期,统信高级研发工程师参与技术分享,为大家介绍了云原生的介…

解读最佳实践:倚天710 ARM芯片的 Python+AI 算力优化

编者按:在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者朱宏林分享了主题为《ARM 芯片的 PythonAI 算力优化》的技术演讲。本次演讲,作者将向大家介绍他们在倚天 710 ARM 芯片上开展的 PythonAI 优化工作,以及在 ARM 云平台…

从敏捷协作到价值交付

前面我的同事在分享的时候,指出目前软件研发的最大问题不是效率,而是研发资源的浪费。可能产品经理半天写的需求,开发要埋头苦干三个月。如果错误的选择了一个对业务发展无益的需求,会带着大家往错误的方向越跑越远。 那么什么是…

行动策略过于复杂怎么办?试试下面一些解决方法

背景 随着使用SLS告警越来越深入,有些用户的行动策略会配置的特别复杂,有些时候可以让用户通过创建多个行动策略来进行一定的精简,但是在一些场景下,用户是无法创建多个行动策略的。例如用户想要通过SLS来统一管理其各个监控系统…

从效能公式解构研发效能

这几年,云原生、Web3.0、元宇宙等技术的出现和应用,正在深刻地改变着我们这个世界。以数字技术应用为主线的数字化转型是此次人类文明变革的核心动力。在这一变革过程中,软件研发模式的发展起到了重至关重要的作用。从早期瀑布式、精益敏捷、…

阿里CCO:基于 Hologres 的亿级明细 BI 探索分析实践

CCO是Chief Customer Officer的缩写,也是阿里巴巴集团客户体验事业部的简称。随着业务的多元化发展以及行业竞争的深入,用户体验问题越来越受到关注。CCO体验业务运营小二日常会大量投入在体验洞察分析中,旨在通过用户的声音数据结合交易、物…