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.xdnf.cn/news/1543742.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用

828华为云征文&#xff5c;华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Note Mark 介绍2.1 Xnote简介2.2 Xnote特点2.3 主要使用场景 三、本次实…

浅谈剩余电流动作保护装置的功能和应用

【摘要】介绍了剩余电流动作保护装置的组成、类型及功能&#xff0c;并针对设计中存在的问题&#xff0c;提出了在工程应用中需要注意的事项&#xff0c;进而结合相应的规范、标准和应用实际&#xff0c;分析了剩余电流动作保护装置在不同应用场所、不同电气环境下应如何正确选…

数据结构实验二之线性表(中)

实验题3:实现双链表的各种基本运算的算法 题目描述 编写一个程序dlinklist.cpp,实现双链表的各种基本运算和整体建表算法(偏 双链表的元素类型ElemType为int),并在此基础上设计一个程序exp2-3.cpp完成以 功能。 (1)初始化双链表h。 (2)依次采用尾插法插入元素a、b、c、d、e。 …

springboot itextpdf 形式导出pdf

先看效果(这里只设置了软件版本和 完成情况的勾选框) 导入pom依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version> </dependency> <!--itextpdf--> <d…

C++之初识STL(概念)

STL&#xff08;标准模板库&#xff09; STL广义分类为&#xff1a;容器&#xff0c;算法&#xff0c;迭代器 * **容器**和**算法**之间通过**迭代器**进行无缝连接 意义&#xff1a;C的**面向对象**和**泛型编程**思想&#xff0c;目的就是**复用性的提升** STL六大组件 1. 容…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

PostgreSQL的学习心得和知识总结(一百五十一)|[performance] PostgreSQL列对齐

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

九泰智库 | 医械周刊- Vol.59

⚖️ 法规动态 国家药监局&#xff1a;截至目前已批准296个创新医疗器械上市 近日&#xff0c;国家药监局在“推动高质量发展”系列主题新闻发布会介绍。截至目前&#xff0c;国家药监局已批准296个创新医疗器械上市&#xff0c;这些创新医疗器械主要集中在植介入类设备、高端…

孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站

你是不是也经常在抖音上刷到很火的伤感视频&#xff0c;那么伤感视频素材都在哪里可以下载呢&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就跟大家聊聊那些可以下载伤感素材高清无水印的网站&#xff0c;如果你也在苦苦找寻伤感素材&#xff0c;快来看看吧&#…

基于Es和智普AI实现的语义检索

1、什么是语义检索 语义检索是一种利用自然语言处理&#xff08;NLP&#xff09;和人工智能&#xff08;AI&#xff09;技术来理解搜索查询的语义&#xff0c;以提供更准确和相关搜索结果的搜索技术&#xff0c;语义检索是一项突破性的技术&#xff0c;旨在通过深入理解单词和…

yolov5训练后自动保存打印到屏幕的性能信息

Windows环境&#xff1a; 执行train程序结束之后&#xff0c;会在屏幕打印下列信息&#xff1a; 我们在进行多轮训练时&#xff0c;性能信息不能及时保存&#xff0c;键入以下代码&#xff0c;可自动保存 #放在引入模块后面 sys.stdout open(train_output.txt, w) #这两行代…

音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件

通过FFmpeg命令可以合并视频和音频。比如合并mp4文件中的视频和AAC裸流&#xff08;关于AAC裸流具体可以参考&#xff1a; 《音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件》&#xff09;中的音频&#xff0c;生成FLV文件&…

string map练习

to_string 在<string>头文件的std命名空间中 要格式化写浮点型入字符串用 2.map 直接尾插 set,map同方法&#xff0c;map只是把键变为pair键值对 4. string的花括号隐式类型转换不能字母个数字母&#xff0c;会被认为是初始化列表&#xff0c;而不是个数加字母的隐式类…

SpringBoot 整合 apache fileupload 轻松实现文件上传与下载(通用版)

我们以Thymeleaf页面模板引擎为例&#xff0c;简单介绍利用 apache fileupload 工具实现文件上传的功能。 2.1、添加相关依赖包 首先创建一个基础的 Spring Boot 项目&#xff0c;并引入相关的依赖包。 2.2、添加相关配置参数 2.3、文件上传示例 对应文件上传的Controller类&…

QT设计中文输入法软键盘DLL给到C#开发步骤

开发目的&#xff1a;本文提供解决触摸屏C#程序中无法输入中文问题&#xff0c;中文拼音采用开源的谷歌输入法程序、使用QT编译中文输入法界面和中文输入法接口给到C#使用。 开发步骤&#xff1a; 1、QT中设计字母和字符输入界面 2、QT中设计数字输入界面 3、QT中封装调用谷歌…

深度学习:卷积神经网络CNN

目录 一、什么是卷积&#xff1f; 二、卷积神经网络的组成 1. 卷积层 2. 池化层 3. 激活函数 4. 全连接层 三、卷积神经网络的构造 四、代码实现 1.数据预处理 2.创建卷积神经网络 3.创建训练集和测试集函数 4.创建损失函数和优化器并进行训练 一、什么是卷积&…

LPDDR4芯片学习(一)——基础知识与引脚定义

一、基础知识 01 dram基本存储单元 当需要将一位数据存储到DRAM中时&#xff0c;晶体管会充电或放电电容。充电的电容表示逻辑高&#xff08;1&#xff09;&#xff0c;放电的电容表示逻辑低&#xff08;0&#xff09;。由于电容会随着时间泄漏电荷&#xff0c;因此需要定期刷…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点 图一&#xff1a; 图二&#xff1a; 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;root [4,2,7,1…

Python记录

1.冒泡排序 时间复杂度O&#xff08;n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…

护理陪护小程序|陪护系统||陪护系统开发

在当今社会&#xff0c;随着人口老龄化的加剧和家庭结构的变化&#xff0c;护理与陪护服务的需求日益增长。为了更好地满足这一市场需求&#xff0c;并提升服务效率与质量&#xff0c;护理陪护小程序应运而生。这类小程序不仅为用户提供了便捷、高效的服务预约与管理平台&#…