从编译到可执行,eBPF 加速容器网络的原理分析 | 龙蜥技术

news2024/9/23 9:33:27

编者按:eBPF(extended Berkeley Packet Filter) 是一种可以在 Linux 内核中运行用户编写的程序,而不需要修改内核代码或加载内核模块的技术。简单说,eBPF 让 Linux 内核变得可编程化了。本文整理自龙蜥大讲堂第 57 期,浪潮信息 SE 王传国从原理上分析了 eBPF 的加载工作过程,解释了它如何保证系统运行稳定以及它能加速网络的原因。

01

eBPF 加载过程

我们知道,一般 eBPF 的加载过程,首先是写 C 代码,然后用 llvm lang 编译成 ELF 文件,接着用 libelf 对 ELF 文件进行解析,解析之后按照 libbpf 所需要的格式进行数据的整理、组织,再通过 BPF 的系统调用,可以将这些数据都加载到内核里面,包括程序翻译出来的 eBPF 指令集。

在内核里面有校验器负责对程序进行校验,有 JIT 对程序进行翻译解析。

1.1 重定位

BPF 基础设施提供了一组有限的“稳定接口”, 使用 convert_ctx_access 对各种 CTX 进行转换,在内核版本升级时保证稳定。

CO-RE 核心思想就是采用(BTF)非硬编码的形式对成员在结构中的偏移位置进行描述,解决不同版本之间的差异。

需要重定位的元素:Map、函数调用、Helper函数调用、字段、Extern 内核符号和kconfig。

1.2 安全性检查:数据、指令、循环

数学计算除数不能为 0,指令调用范围[0, prog->len)深度优先遍历排除环。

1.3 eBPF 指令集

1.4 指针安全性检查

确定指针类型、范围纠正,识别不了的指针类型不允许引用。

范围检查,不同的指针类型有不同的检查方法和范围。

02

eBPF 加速容器网络

主要涉及的 eBPF 程序类型:XDP、tc、sock_ops

它们加速网络性能的基本原理都是把数据直接从一端(网口/socket)的发送队列传递到另一端的接收或发送队列,绕过不需要的网络协议栈。

XDP 位于整个 Linux 内核网络软件栈的底部,还未生成 skb,能够非常早地识别并丢弃攻击报文,具有很高的性能;但是在虚拟机中有时候可能无法支持 XDP 程序的加载,例如虚拟机网卡的接收队列太少。

在 tc 功能的 sch_handle_ingress、sch_handle_egress 添加 hook 点,分别是 tc ingress 和 tc egress,没有 XDP 那么多要求,基本上所有的 OS 中都能使用,绕过 netfilter 等非必要的内核网络协议栈路径,能极大地提升网络性能,降低延迟。

技术概述:把数据从一端 socket 发送队列直接发送到对端 socket 的接收队列或发送队列。

sockops:挂载到cgroup,监控整个 cgroup 中所有 socket 的握手和挥手(主动|被动),记录 tcp 连接。

sockmap:存储数据特征与 socket 句柄的关系。写数据时执行 bpf_map_update,修改对应 socket 的 sendmsg 函数指针。

sk_msg:使用 sockmap 对数据进行 redirect 判定。

经过我们的测试,如果用 Cilium 替换 calico,用 TCP Throughput 模式测,那么 pod 间的通讯性能 tcp 吞吐量提升 58%、sockops 提升 153%、跨节点也能提升 24%。

如果用 TCP-RR 模式来测,那么相比 calico 同节点能提升 28%、sockops 提升200.82%、跨节点提升 43%。

如果用 TCP_CRR 模式去测的话, calico 同节点能提升40%、sockops 提升 35% 、跨节点提升 55%。

Cilium 在提升性能的时候,它对于 CPU 的占用降低了 10% 以上,因此我们测试的结果是 Cilium 的性能要明显优于使用 iptables 的 calico。所以说目前我们打算使用 Cilium 优化我们的容器网络。

—— 完 ——

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

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

相关文章

HTML防数据采集

什么是防采集 就是我们想利用爬虫工具采集某个网站的数据(前提当然是公开合法数据),但网站不想给你采集而设置的技术阻挡措施。 常见的防止采集方案 利用输入验证码框验证,在采集某些网站过程中,要求你输入验证码&a…

电源特性测试测试哪些方面?电源特性自动测试系统NSAT-8000介绍

假设电源适配器厂家对电源适配器进行了很合理的测试验证工作,那么电源适配器输出的电压应该是个稳定的电源输出。那么对于一些小型设备而言,电源测试就主要测试设备电源端的测试工作。下面纳米软件Namisoft小编将带大家一起看看,关于电源特性…

Android Jetpack Compose——一个简单的笔记APP

一个简单的笔记APP简述效果视频Hilt提供依赖对象Room CRUD接口实现类内容封装查询所有查询删除插入笔记内容效果图ViewModel依赖注入数据初始化数据处理View标题栏排序组件笔记列表新建&编辑笔记效果图ViewModel依赖注入初始化数据处理View背景颜色条标题保存笔记路由导航建…

动态规划 0-1背包问题(滚动数组思想优化)

目录 125 背包问题(二)LintCode 炼码 0-1背包滚动数组优化 0-1背包问题(一)LintCode 炼码 【解法一】二维数组 【解法二】滚动数组 125 背包问题(二)LintCode 炼码 class Solution { public:/*** para…

HADOOP-3.2.2安装

HADOOP-3.2.2安装一. 准备工作二.安装阶段1. 创建安装目录并安装解压包2.修改配置文件core-site.xml3. 修改hdfs-site.xml4. 修改修改yarn-site.xml5.修改workers文件6.修改hadoop-env.sh7.修改mapred-site.xml8.递归创建目录9.分发文件三.运行阶段1.启动hdfs2.启动yarn3.启动j…

F280049C Crossbar X-BAR

文章目录X-BAR9.1 输入X-BAR9.2 ePWM、CLB和GPIO输出X-BAR9.2.1 ePWM X-BAR9.2.1.1 ePWM X-BAR架构9.2.2 CLB X-BAR9.2.2.1 CLB X-BAR架构9.2.3 GPIO输出X-BAR9.2.3.1 GPIO输出X-BAR架构9.2.4 X-BAR标志总结X-BAR 交叉开关(在本章中称为X-BAR)提供了以各…

一年风雨几度寒,一杯浊酒敬虎年

我是谁大家好,我是凡夫贩夫,真实姓名不值一提,我的履历也很不值一提,非名校非大厂非专家,一名三非野生java开发者,现居住地河南郑州,就职于一家外包公司。的确,我是一个普通人&#…

(02)Cartographer源码无死角解析-(46) 2D栅格地图→CastRay()函数与贝汉明(Bresenham)算法

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

PCB设计完成后,为什么经常要拼版及拼版注意事项

通常我们在完成PCB设计的时候,有一些板子我们通常是需要进行拼版的,那么我们为什么要拼版,哪种情况下需要拼版呢?不拼是否可以呢?1、PCB生产制作尺寸要求 一般来说面积比较小的板子我们是需要进行拼版,一般…

MATLAB APP 设计实践(一)UART通信(下篇)

引言上篇介绍了 MATLAB App 的基本内容,本篇就结合UART发送数据的具体案例介绍开发过程。文末给出设计源文件、设计的可执行文件的下载链接,以及App的实际使用视频(与FPGA开发板进行调试验证)。前文链接:MATLAB APP 设…

MySQL 分区(innode引擎的讲解)

目录 一.InnoDB逻辑存储结构 段 区 页 二.分区概述 分区 三.分区类型 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。 段 段就是…

【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

文章目录基本原理绘图层次定义距离基本原理 和Birch聚类相似,层次聚类也是一种依赖树结构实现的聚类方法,其核心概念是相似度。根据相似度,可以将所有样本组织起来,从而构建一棵层次聚类树。 其中Birch算法的核心,叫…

MyBatis【多表查询与动态SQL使用】

MyBatis【多表查询与动态SQL使用】🍎一.MyBatis多表查询🍒1.1 一对一查询🍒1.2 一对多查询🍎二.动态SQL使用🍒2.1 if 标签使用🍒2.2 trim 标签使用🍒2.3 where 标签使用🍒2.4 set 标…

ARX测试_绘制道路横断面

本文迁移自本人网易博客,写于2011年1月12日,ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)1、已提供道路的图形,获取用户输入的两点,并在两点间画一条虚线。计算这条直线与多少条直线相交,若数量不等于…

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58( 0x33~0x3A) 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时,寄存器 51 内为频率值,寄存器 55 内为温度值 4 通道模块时,寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先,是PMP考试的核心教材:《PMBOK指南》,目前已经出道第七版了,大家如果有备考的需要要赶紧买一本来学习。 其次,是《汪博士解读PMP》,目前出到第6版,这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄指南目录📖:🎉🎉机械臂速成小指南(零点五):机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况,当监测到皮带出现撕裂跑偏时,立刻抓拍告警并中止皮带的运输。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面,最好、最容易上手的动态博客系统之一( solo 也是),轻快,简洁,功能强大。 正文 上周末正在募集团队一起写算法题,群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…