Cilium + ebpf 系列文章-什么是ebpf?(一)

        前言:

        这篇非常非常干,很有可能读不懂。

        这里非常非常推荐,建议使用Cilium官网的lab来辅助学习!!!
Resources Library - IsovalentExplore Isovalent's Resource Library, your one-stop destination for insightful videos, case studies, blogs, books, labs, analyst reports, and more.icon-default.png?t=O83Ahttps://isovalent.com/resource-library/?solution=networking

一、为什么需要新的ebpf技术?        

在对吞吐量、延迟敏感的业务生产场景中,容器网络的类型选择显的格外重要:

Docker Networking Tutorial(Mac-vlan vs Bridge vs overlay)-CSDN博客文章浏览阅读147次。一、We Create a container be a Server.二、We Create a container be a Client.三、Them link at a Bridge.四、 Do test.一、Test-tools。二、Test-step。https://blog.csdn.net/weixin_46510209/article/details/142424382?spm=1001.2014.3001.5501 上面为我编写的博客,来对比不同类型网络速率对比。

直接说结论:

        Mac_vlan > Bridge > overlay 

Mac_vlan 性能为Bridge的3倍、8倍于overlay网络。

约接近物理网络越快,只要过了任何虚拟NIC或者隧道,性能都会大大折扣。

但越接近物理网络则会凸显物理网络的弊端,10多年没有更新的网络协议栈,很多业务场景大大受限制。

那么有没有一种技术,即可以实现高性能、又可以封装隧道、又可以监控系统调用,并且支持k8s.

ebpf!

二、什么是ebpf?

ebpf(扩展的伯克利数据包过滤器)

        这是在运行Linux 5.x+内核的顶级子程序。

        他运行用户在 Linux用户空间对在运行在内核空间对ebpf程序进行编程.

        实现网络数据包处理、性能监控、故障排除和安全策略等多种任务。

        ebpf之所以可以实现上述的能力,是因为ebpf支持多种类型挂载点(即将你编写的ebpf程序挂载到相应类型的能力的挂载点上)。

比如网络(XDP),系统调用(内核函数)(Kprobe 和 Kretprobe),系统调用(用户空间程序)Uprobe 和 Uretprobe等等。

三、ebpf的工作原理

      编写 eBPF 程序 编译 eBPF 程序 加载 eBPF 程序 运行eBPF 程序 收集和分析eBPF 程序

别慌,完事都可以用Python.
BCC库,提供了一个Python接口。意思就是虽然ebpf是C语言写的,但是你可以用Python的代码机构来实现。

接下来是代码了:

这里为了方便你能继续读懂,必须要补充和复习一下系统调用的碎片知识。

1、用户空间是无能直接操作、编程内核函数的!

2、用户空间的所有操作都是由很多很多系统调用来具体实现的。比如:你cat 、ls 一个文件,那么背后就是open,write,read,close 等系统调用来实现!

简单的说系统调用是用户空间于内核空间访问的通道,他是一个标准的接口,一个抽象层。

3、当你执行l s操作时,会调用open的系统调用,然后open的系统调用具体是使用do_sys_open这个内核函数来具体执行!

4、接下来代码中你看不到系统调用open,但你能看到do_sys_open这个内核函数.因为ebpf是运行在内核层!

下面为例子,来方便理解:

这个 Python 脚本使用 BCC (BPF Compiler Collection) 来编写和加载一个简单的 eBPF 程序,该程序在来追踪每次文件打开操作,并记录文件名。

open 系统调用用于打开文件。

Linux命令: ls cat touch vim 都会调用open系统调用。

do_sys_open:这个内核函数对应系统调用的open

#!/usr/bin/python3
from bcc import BPFprogram = r"""
#include <uapi/linux/ptrace.h>
#include <linux/fs.h>BPF_HASH(counter, u64);int trace_open(struct pt_regs *ctx, const char __user *filename, int flags) {u64 uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;u64 *count = counter.lookup(&uid);u64 zero = 0;if (count) {(*count)++;} else {counter.update(&uid, &zero);}bpf_trace_printk("File opened: %s\\n", filename);return 0;
}
"""b = BPF(text=program)
b.attach_kprobe(event="do_sys_open", fn_name="trace_open")print("Tracing file open... Ctrl-C to end.")
b.trace_print()

**上面的代码的简单解释:

##编写ebpf程序:这一块语言是C语言,但是不用你自己写,你可以用ai帮助你完成,你只需要告诉他你想做什么。

BPF_HASH(counter, u64);int trace_open(struct pt_regs *ctx, const char __user *filename, int flags) {u64 uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;u64 *count = counter.lookup(&uid);u64 zero = 0;if (count) {(*count)++;} else {counter.update(&uid, &zero);}bpf_trace_printk("File opened: %s\\n", filename);return 0;
}
"""

##加载 eBPF 程序并附加到 open 系统调用:这一段代码是Python。

b = BPF(text=program)
b.attach_kprobe(event="do_sys_open", fn_name="trace_open")

        将上面的代码放置在一个脚hello.py的文件中,执行 eBPF 程序(请提前安装BCC工具集)

./hello.py

        收集和分析数据

在另一个终端中执行一些命令(如 ls touch vim等等都可以),触发 open系统调用.

下面为演示效果:

验证成功加载:

bpftool prog show

 

 

##上面的实验是为了证明你在用户空间编写的ebpf程序可以在内核中运行,并且监控系统调用和内核函数。 

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

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

相关文章

unittest初始化,资源清理,执行所有测试用例,跳过测试用例,输出测试结果的详细程度以及discover加载文件里面的所有匹配到的.py测试用例

前言 # setUp和tearDown 每次用例执行前都会执行初始化条件和结束条件 # 执行所有用例只运行一次初始化和清理条件&#xff0c;用setupclass&#xff0c;teardownclassimport unittestclass UserTestCase(unittest.TestCase):classmethoddef setUpClass(cls):print("setU…

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

240929-CGAN条件生成对抗网络

240929-CGAN条件生成对抗网络 前面我们学习了GAN&#xff08;240925-GAN生成对抗网络-CSDN博客&#xff09;和DCGAN&#xff08;240929-DCGAN生成漫画头像-CSDN博客&#xff09;&#xff0c;接下来继续来看CGAN&#xff08;Conditional GAN&#xff09;条件生成对抗网络。 流…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

ros的工作空间

Create a ROS Workspace创建一个ros工作空间 $ catkin_make该命令可以在当前目录下的“src”文件夹中创建CMakeLists.txt链接。会自动生成build和devel文件&#xff0c;以下是 catkin_make 的几个主要作用&#xff1a; 构建 ROS 包&#xff1a;catkin_make 会在当前工作空间中…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

Cesium GIS项目关于湖泊识别与提取的实现

1. 引言 项目背景 随着遥感技术的发展,地理信息系统的应用越来越广泛。本项目旨在开发一个基于Cesium的地理信息系统,利用深度学习技术自动识别并显示湖泊的位置。 目标与意义 通过自动化处理大量遥感影像数据,提高湖泊监测的效率和准确性,为水资源管理和环境保护提供支…

uniapp js判断key是否在json中?

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

PG数据库的Jsonb全文检索查询

1.操作键值对 PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。 -> 操作符用于通过 JSON 对象中的键来获取对应的值。->> 操作符可以将获取到的值提取出来转化为字符串类型。 例如&#xff0c;下面是一个包含 jsonb 类型字段的表&#x…

Python程序:设计一个多维度数据聚合系统:从概念到实现

设计一个多维度数据聚合系统:从概念到实现 在现代数据驱动的世界中,企业和组织需要处理和分析大量的数据,以便做出明智的决策。数据聚合系统是实现这一目标的关键工具之一。本文将详细介绍如何设计和实现一个支持多维度数据汇总的数据聚合系统,使用Python编程语言。我们将…

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 通过状态模式&#xff0c;可以消除通过 if-else…

计241 作业2:C程序设计初步

问题 A: C语言实验——计算AB&#xff08;顺序结构&#xff09; 思路讲解: 这个直接计算ab就好&#xff0c;没有什么困难的&#xff0c;用来熟悉环境最适合不过 代码实现: #include<stdio.h>int main() {int a,b;scanf("%d %d",&a,&b);printf("…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…

监控易监测对象及指标之:全面监控Sybase_New数据库

随着企业数据量的不断增长和业务的复杂化&#xff0c;数据库的稳定性和性能成为了保障业务连续性的关键因素。Sybase_New数据库作为众多企业选择的数据管理解决方案&#xff0c;其稳定性和性能对于企业的运营至关重要。 为了确保Sybase_New数据库的稳定运行和高效性能&#xff…

nvm以及npm源配置

配置 NVM 和 NPM 使用镜像源 接上一篇。国内使用会遇到网络连接问题。为了解决这个问题&#xff0c;我们可以配置 NVM 和 NPM 使用腾讯的源。 配置 NVM 源 首先&#xff0c;我们需要配置 NVM 源。可以使用以下命令&#xff1a; export NVM_NODEJS_ORG_MIRRORhttps://mirrors.…

使用php生成图片

可以用这方法生成图片 水印 字体可以在资源绑定下载&#xff0c;如果字体路径不对&#xff0c;则不会输出文字图片 public function generateImage($text,$id) { header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:0…

【CSS in Depth 2 精译_042】6.4 CSS 中的堆叠上下文与 z-index(下)——深入理解堆叠上下文

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

使用Hutool-poi封装Apache POI进行Excel的上传与下载

介绍 Hutool-poi是针对Apache POI的封装&#xff0c;因此需要用户自行引入POI库,Hutool默认不引入。到目前为止&#xff0c;Hutool-poi支持&#xff1a; Excel文件&#xff08;xls, xlsx&#xff09;的读取&#xff08;ExcelReader&#xff09;Excel文件&#xff08;xls&…

Adobe Photoshop 2024 v25.12 (macOS, Windows) 发布下载 - 照片和设计软件

Adobe Photoshop 2024 v25.12 (macOS, Windows) - 照片和设计软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD…

【unity进阶知识3】封装一个事件管理系统

前言 框架的事件系统主要负责高效的方法调用与数据传递&#xff0c;实现各功能之间的解耦&#xff0c;通常在调用某个实例的方法时&#xff0c;必须先获得这个实例的引用或者新实例化一个对象&#xff0c;低耦合度的框架结构希望程序本身不去关注被调用的方法所依托的实例对象…