[转帖]一文入门前景广阔的 eBPF
https://zhuanlan.zhihu.com/p/567375673
【摘要】eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理。这种灵活性使得对于不可见的kernel具有了可观测性的基础,在进行内核监控、网络故障分析、文件系统分析等方面具有广泛的使用前景。本文将带你了解eBPF发展历程、原理、用途及特点。
【作者】陈成,中国联通软件研究院容器云研发工程师,公共平台与架构研发事业部云计算研发组长,长期从事大规模基础平台建设相关工作,先后从事Mesos、KVM、K8S等研究,专注于容器云计算框架、集群调度、虚拟化等。
eBPF对应用开发者而言,可能些许陌生,但是对于从事云、网络、操作系统等相关的开发者而言,近年来或多或少听说过或使用过。那么eBPF到底是什么?它有何作用?如何使用?今天这篇文章就来一一解答。
1、eBPF发展历程及原理
eBPF(extended Berkeley Packet Filter),意为“可扩展数据包过滤器”,是一种网络数据包的过滤技术。在eBPF出现前,BPF (也称为cBPF , classic BPF ) 得到了广泛的应用,BPF 最初的名字 BSD Packet Filter ,源于BSD操作系统上的一种包过滤机制,后经发展,被作者的工作单位名所替代,变成了 Berkeley Packet Filter。BPF支持数据包筛选,允许用户态程序提供要接收的数据包条件。最常用的tcpdump就是基于BPF 实现 的过滤出tcp包或udp包等功能。由于BPF实现了在内核直接过滤处理的能力,因此避免了不符合条件的数据包被“多余地”复制到用户态,从而大大提高了性能。
eBPF,作为扩展版本的BPF,支持JIT机制,动态地将用户态自定义指令解释为机器代码,并在内核中执行,从而大大提高了灵活性。在eBPF之前,内核模块是注入内核的最主要机制。由于缺乏对内核模块的安全控制,内核的基本功能很容易被一个有缺陷的内核模块破坏。而eBPF则借助即时编译器(JIT),并在kernel预先控制好开放的植入范围及校验程序,保证只有被验证安全的eBPF指令才会被内核执行。
eBPF伴随着kernel的发展,逐步完善和成熟,其发展历程大致如下:
1992年,BPF诞生,初衷是提供一种内核中自定义报文过滤的手段
2011年,kernel 3.2版本对BPF重大改版,引入BPF JIT,性能得到提高
2014年,kernel 3.15版本,eBPF出现,引入了verify、高级编程语言编程支持等
2016年,kernel 4.8版本,eBPF支持XDP
2018年,kernel 4.18版本,引入BTF
2020年,kernel 4.20版本,引入CO-RE
2020年,kernel 5.2版本,引入debug_btf
2、eBPF用途及特点
为什么使用eBPF?
内核可编程性
eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理,这大大提高了灵活性。
广泛应用场景
正是由于这种灵活性,使得对于不可见的kernel具有了可观测性的基础,在进行内核监控、网络故障分析、文件系统分析等方面具有广泛的使用前景。
正是由于这些突出的特性,eBPF程序可以附加到各种内核子系统,包括网络,跟踪和Linux安全模块(LSM)。比如,Facebook开源的高性能网络负载均衡器Katran、Isovalent开源的容器网络方案 Cilium ,以及著名的内核跟踪排错工具 BCC 和 bpftrace 等,都是基于eBPF技术实现的。更有意思的是,盘古实验室发现了NSA也使用BPF技术在Linux布置后门。
下图为内核跟踪排错工具BCC所支持的追踪点示意图,可见当前内核中除了驱动部分外的几乎所有子系统、高级语言、应用均已支持细粒度的跟踪分析:
▲BCC工具集 ( 来源:BPF之巅:洞悉Linux系统和应用性能)
那么,eBPF程序又是如何工作的呢?
3、eBPF工作流程
在了解eBPF之前,需要先了解钩子(hook)机制,钩子机制顾名思义即可以挂载一种未确定的逻辑处理过程以实现对特定位置的处理,这种未确定性即灵活性,可以实现定制化或配置化管理,实现不同的需求。在linux内核中有一套hook函数机制(khook),可以在不同的hook点监控或处理如:文件打开、关闭等操作;网络包过滤、转换。最常见的netfilter就是借助于一整套的hook函数机制,实现了数据包在三层以上的过滤、NAT转换、基于协议的跟踪等等,具体参考:linux netfilter hook
eBPF程序是事件驱动的,当内核或应用程序通过某个钩子点(hook point)时触发执行。预定义的钩子包括:系统调用、函数进入/退出、内核跟踪点、网络事件等。
▲hook architecture
如果不存在用于特定需求的预定义钩子,则可以创建内核探测器(kprobe)或用户探测器(uprobe)以将eBPF程序附加到内核或用户应用程序中的几乎任何位置。
▲eBPF hook overview
虽然现在我们依然不清楚如何写一个钩子处理函数,即eBPF程序的具体逻辑,不用担心,我们假设已经有了这样一个程序,那它会如何被处理,并执行起来呢?
▲eBPF全流程调用 ( 以Go语言为例)
上图展示了一个程序是如何被加载、验证并执行的,具体来看,经历了如下步骤:
第一步:编写的c eBPF程序,经过编译器,编译为eBPF伪代码,即eBPF字节码(具体会在第二讲中进行介绍)
第二步:编译好的代码,会被eBPF所对应的高级语言库程序加载,并由高级语言进行系统调用处理(目前eBPF支持golang、python、c/c++、rust等)
第三步:通过系统调用陷入内核后,首先由内核eBPF程序进行验证(verify),这一步确保(1)程序本身无误(不会崩溃、不会出现死循环);(2)没有权限异常;然后进行将编译为eBPF伪代码的程序再转换为具体的机器指令集,以优化程序执行,并最终挂载到对应的hook点或追踪点。
第四步:内核在处理某个追踪点时,刚好有eBPF,就会触发事件,并由加载的eBPF程序处理
4、eBPF的不足
但是我们要知道的是eBPF不是万能的,受限于本身内核版本支持能力、eBPF指令的种类、eBPF虚拟机结构等,eBPF程序并不能发挥其无限的能力,仅仅是“山顶跳舞”。
不过,基于这广泛的应用,无论是linux kernel社区,还是工具社区,都在试图突破这些限制,例如将高版本kernel才具备的能力以低成本的方式移植到低版本上,或者是实现一次编译,到处运行(CO-RE)等。
eBPF开发工具
BCC
bpftrace
eBPF Go Library
libbpf C/C++ Library
参考文献
eBPF核心技术与实战:https://time.geekbang.org/column/article/479384
linux内核协议栈netfilter之hook机制:https://blog.csdn.net/wangquan1992/article/details/109352908
10T 技术资源大放送!包括但不限于:Linux、虚拟化、容器、云计算、网络、Python、Go 等。在开源Linux公众号内回复「10T」,即可免费获取!
shell编程100例(附PDF下载) IPv6技术白皮书(附PDF下载) Linux主流发行版本配置IP总结(Ubuntu、CentOS、Redhat、Suse) 批量安装Windows系统 无人值守批量安装服务器 运维必备的《网络端口大全》,看这一份就够了。 收藏:服务器和存储知识入门 什么叫SSH?原理详解,看这一篇就够了! Nginx面试40问(收藏吃灰) 20 个 Linux 服务器性能调优技巧 超详细!一文带你了解LVS四层负载均衡企业级实践! 收藏 | Linux系统日志位置及包含的日志内容介绍 100 道 Linux 常见面试题,建议收藏,慢慢读~ 服务器12种基本故障+排查方法 IT运维管理常用工具大全,让你成为真正的高手 什么是QoS?Linux学习指南有收获,点个在看
[转帖]一文入门前景广阔的 eBPF的更多相关文章
- RealSense 3D实感体验:前景广阔目前应用少
腾讯数码讯(周硕)在去年的IDF大会上,英特尔着重展示了其全新的RealSense 3D实感技术,而厚度仅6mm堪称史上最薄平板的戴尔Venue 8 7000也成为首个搭载RealSense技术的产品 ...
- 一文入门HTML5
1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...
- 一文入门Redis
一文入门Redis 目录 一文入门Redis 一.Redis简介 二.常用数据类型 1.String(字符串) 2.Hash(哈希) 3.List(列表) 4.Set(集合) 5.Zset(有序集合) ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- 一文入门NodeJS
NodeJS¶ 1.环境配置¶ 之前讲ES6的时候有提过一部分Node的知识,简单回顾下:一文读懂ES6 1.1.NPM国内镜像¶ npm国内镜像:https://npm.taobao.org 配 ...
- [转帖]SAP一句话入门:Plant Maintenance
SAP一句话入门:Plant Maintenance http://blog.vsharing.com/MilesForce/A618273.html PM就是Plant Maintenance(本文 ...
- [转帖]SAP一句话入门:Production Planning
SAP一句话入门:Production Planning http://blog.vsharing.com/MilesForce/A617692.html SAP是庞大的,模块是多多的,功能是强大的, ...
- [转帖] YAML 快速入门
https://www.jianshu.com/p/97222440cd08 原始文档更加易读. YAML快速入门 叩丁狼教育 关注 2018.02.18 19:19* 字数 1776 阅读 876评 ...
- 【转帖】Systemd 入门教程:命令篇
Systemd 入门教程:命令篇 Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...
- 教程 | 一文入门Python数据分析库Pandas
首先要给那些不熟悉 Pandas 的人简单介绍一下,Pandas 是 Python 生态系统中最流行的数据分析库.它能够完成许多任务,包括: 读/写不同格式的数据 选择数据的子集 跨行/列计算 寻找并 ...
随机推荐
- hiveSQL常见专题
SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...
- 实例讲解基于Sermant快速开发服务治理插件
本文分享自华为云社区<Sermant框架下的服务治理插件快速开发及使用指南>,作者: 华为云开源 . Sermant是基于Java字节码增强技术的云原生无代理服务网格,它具有非侵入.插件化 ...
- 一文掌握GaussDB(DWS) SQL进阶技能:全文检索
摘要:本文简要介绍了GaussDB(DWS)全文检索的原理和使用方法. 全文检索(Text search)顾名思义,就是在给定的文档中查找指定模式(pattern)的过程.GaussDB(DWS)支持 ...
- Python图像处理丨如何调用OpenCV绘制直方图
摘要:本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图. 本文分享自华为云社区<[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图> ...
- 一起玩转LiteOS组件:Pixman
摘要:本文将以Pixman Demo为例,详细说明Pixman的功能. 本文分享自华为云社区<LiteOS组件尝鲜-玩转Pixman>,作者:Lionlace. 基本介绍 Pixman是由 ...
- Google 发布:DevOps 2022现状报告
在过去的八年中,全球超过 33,000 名专业人士参与了Accelerate State of DevOps 调查,使其成为同类研究中规模最大.运行时间最长的一项.Accelerate State o ...
- 收钱吧与火山引擎VeDI合作一年后 有了哪些新变化?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 收钱吧正在和火山引擎数智平台(VeDI)跑出一条业务提效新通路. 相关数据显示,收钱吧的日服务人次就近 ...
- Solon 开发进阶
Solon 开发进阶 一.插件扩展机制 二.体外扩展机制 三.常用配置说明 四.启动参数说明 五.全局异常订阅 本系列在内核知识的基础上做进一步延申.主要涉及: 插件扩展体系 体外扩展体系 常用配置 ...
- Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
如何阻止 Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了 使用 CountDownLatch CountDownLatch.CyclicBarrier 使用区别 多线 ...
- CentOS 7上安装 Jenkins 2.346 -- yum 方式
CentOS 7上安装 Jenkins -- yum 方式 装插件太麻烦了,最后选择了 装JAVA 11,安装最版本 Jenkins https://mirrors.jenkins.io/war/ 开 ...