当前位置: 首页 > news >正文

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程序可以在内核中运行,并且监控系统调用和内核函数。 

相关文章:

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

前言&#xff1a; 这篇非常非常干&#xff0c;很有可能读不懂。 这里非常非常推荐&#xff0c;建议使用Cilium官网的lab来辅助学习&#xff01;&#xff01;&#xff01;Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…...

RabbitMQ08_保证消息可靠性

保证消息可靠性 一、生产者可靠性1、生产者重连机制&#xff08;防止网络波动&#xff09;2、生产者确认机制Publisher Return 确认机制Publisher Confirm 确认机制 二、MQ 可靠性1、数据持久化交换机、队列持久化消息持久化 2、Lazy Queue 惰性队列 三、消费者可靠性1、消费者…...

恶意Bot流量识别分析实践

1、摘要 随着互联网的发展&#xff0c;自动化工具和脚本&#xff08;Bots&#xff09;的使用越来越普遍。虽然一些善意 Bots 对于网站的正常运行和数据采集至关重要&#xff0c;但恶意 Bots 可能会对网站带来负面影响&#xff0c;如爬取敏感信息、恶意注册、刷流量等。因此&am…...

Java2 实用教程(第6版)习题2 第四题

【源文件的命名与书中的不同】 四、阅读程序题 1、上机运行下列程序&#xff0c;注意观察输出的结果。 public class E2_1 {public static void main(String args[]){for(int i20302;i<20322;i){System.out.println((char) i);}} } 运行结果&#xff1a; 低 住 佐 佑 佒…...

HashMap和ConcurrentHashMap的区别

1.是什么 HashMap和ConcurrentHashMap都是Java集合框架中的成员&#xff0c;它们用于存储键值对&#xff0c;但它们在并发场景下的表现和行为有很大的不同。以下是它们之间的一些主要区别&#xff1a; 1. 并发安全性 HashMap: HashMap不是线程安全的。如果多个线程同时访问Has…...

css 下拉框展示:当hover的时候展示下拉框 z-index的用法解释

代码如下&#xff1a; <template><div class"outer"><div class"left"></div><div class"aTest2"><div class"box">显示方框</div><div class"aTest3"></div></…...

spring装配笔记

spring装配是个大课题&#xff0c;能懂一点是一点吧。 关于代码链路&#xff0c;最后的方式就是倒序摸索&#xff0c;正序那么多逻辑&#xff0c;没有一百万也差不多少&#xff0c;所以就用倒序。 .(点号)和#井号是一个意思&#xff0c;下面代码可能不详细区分&#xff0c;复…...

vscode【实用插件】Notes 便捷做笔记

安装 在 vscode 插件市场的搜索 Notes点 安装 安装成功后&#xff0c;vscode 左侧栏会出现 使用 初次使用 需先选择一个本地目录 重启 vscode 后&#xff0c;得到 切换笔记目录 新建笔记 快捷键为 Alt N 默认会创建 .md 文件 配合插件 Markdown Preview Enhanced 预览 .md…...

中间件:maxwell、canal

文章目录 1、底层原理&#xff1a;基于mysql的bin log日志实现的&#xff1a;把自己伪装成slave2、bin log 日志有三种模式&#xff1a;2.1、statement模式&#xff1a;2.2、row模式&#xff1a;2.3、mixed模式&#xff1a; 3、maxwell只支持 row 模式&#xff1a;4、maxwell介…...

postman控制变量和常用方法

1、添加环境&#xff1a; 2、环境添加变量&#xff1a; 3、配置不同的环境&#xff1a;local、dev、sit、uat、pro 4、 接口调用 5、清除cookie方法&#xff1a; 6、下载文件方法&#xff1a;...

Spring Boot 中整合 Kafka

在 Spring Boot 中整合 Kafka 非常简单&#xff0c;Spring Kafka 提供了丰富的支持&#xff0c;使得我们可以轻松地实现 Kafka 的生产者和消费者。下面是一个简单的 Spring Boot 整合 Kafka 的示例。 1. 添加依赖 首先&#xff0c;在 pom.xml 中添加 Spring Kafka 的依赖&#…...

什么是开放式耳机?具有什么特色?非常值得入手的蓝牙耳机推荐

开放式耳机是当下较为热门的一种耳机类型。它具有以下特点&#xff1a; 设计结构&#xff1a; 呈现开放式的构造&#xff0c;不会完全堵住耳道。如此一来&#xff0c;外界声音能够较容易地被使用者听到&#xff0c;在使用耳机时可以保持对周围环境的察觉。比如在户外&#xf…...

编译 FFmpeg 以支持 AV1 编解码器以及其他硬件加速选项(如 NVENC、VAAPI 等)

步骤 1: 安装必要的依赖 sudo apt update sudo apt install -y \autoconf automake build-essential cmake git libass-dev libfreetype6-dev \libsdl2-dev libtool libva-dev libvdpau-dev libxcb1-dev libxcb-shm0-dev \libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-…...

解释一下Java中的多线程。如何创建一个新的线程?

在Java中&#xff0c;多线程是一种机制&#xff0c;允许一个程序同时执行多个任务或处理。每个任务被称为一个线程。 这种并行执行可以极大地提高应用程序的效率和响应速度。 例如&#xff0c;在开发一个桌面应用程序时&#xff0c;你可以使用一个线程来更新用户界面&#xf…...

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目&#xff1a;**18.30 (找出单词) 编写一个程序&#xff0c;递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数&#xff1a; java Exercise18_30 dirName word 习题思路 &#xff08;读取路径方法&#xff09;和18.28题差不多&#xff0c;把找…...

MyBatis中 #{} 和 ${} 的区别

1. #{id}&#xff08;参数占位符&#xff09; 作用: 使用 #{id} 时&#xff0c;MyBatis 会将 id 参数绑定为 JDBC 的参数。这种方式能够有效防止 SQL 注入攻击&#xff0c;因为它会进行参数的预处理&#xff0c;将参数值作为数据类型的绑定&#xff0c;而不是直接插入到 SQL 语…...

Android Perfetto 学习

1、如何抓取性能日志 方式1、通过手机里的System Tracing抓取 1、点击Settings->System->Developer options->System Tracing->Record trace 打开 2、操作完成后&#xff0c;点击Settings->System->Developer options->System Tracing->Record trace…...

ES数据的删除与备份

背景 需要删除索引下满足指定条件的文档数据&#xff0c;并将删除的数据进行备份。 操作步骤 新建索引 该索引结构与映射关系与原索引一致 查看原索引设置 GET /tb/_settings结果&#xff1a; {"tb" : {"settings" : {"index" : {"ro…...

论文解读《Object-Centric Learning with Slot Attention》

系列文章目录 文章目录 系列文章目录论文细节理解 1. 研究背景2. 论文贡献3. 方法框架3.1 Slot Attention模块3.2 无监督对象发现架构 4. 研究思路5. 实验6. 限制 论文细节理解 supervised property prediction tasks是什么&#xff1f; Supervised property prediction tasks…...

YOLOv8+注意力机制+PyQt5玉米病害检测系统完整资源集合

资源包含可视化的玉米病害检测系统&#xff0c;基于最新的YOLOv8注意力机制训练的玉米病害检测模型&#xff0c;和基于PyQt5制作的可视玉米病害系统&#xff0c;包含登陆页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的七类玉米病害&#xff1a;矮花叶病…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...