当eBPF遇上Linux内核网络

一口Linux 2022-07-08 00:00

大家好,我是西安邮电大学陈莉君老师研三学生梁金荣,今天给大家分享的主题是《当eBPF遇上Linux内核网络》

主要有四部分:

  • Linux内核网络数据的收发流程
  • eBPF优化Linux内核网络
  • eBPF提取内核网络数据
  • 可视化展示eBPF提取的数据

视频讲解链接:https://www.bilibili.com/video/BV1ch411U75f?spm_id_from=333.999.0.0

Linux内核网络数据收发流程

我们经常说的TCP/IP五层模型从上层到下层依次是应用层、传输层、网络层、链路层和物理层。其中应用层主要负责为应用进程提供服务,传输层主要负责实现端到端的数据传输,网络层主要负责数据报路由以及把分组报文发送到目标网络或者主机,链路层主要负责跨物理层在网段节点之间传输数据。

在Linux中主要对网络传输层、网络层和链路层进行了实现。传输层 网络层统称为协议层,链路层主要由网络设备驱动实现。

Linux网络接收数据包流程

在Linux内核中当数据包到达网卡的时候,通过DMA方式将数据映射到内存。然后硬中断通知CPU有数据到来,调用硬中断处理函数,之后交给软中断去处理。通过ksoftirq调用软中断处理函数,收包的软中断处理函数是net_rx_action函数,主要将Ring Buffer缓冲区数据做成sk_buff送给上层协议栈进行处理,之后数据包经过层层解包最终将数据放入套接字缓冲区中,CPU通过将数据拷贝给应用程序。

Linux网络接收数据包流程

首先,应用层应用程序通过CPU将数据拷贝到套接字缓冲区,然后数据包经过层层处理封装好数据包,经过软中断处理函数,通过建立dma映射,将数据放到发送缓冲区中,最后经过一个物理的网卡发送出去。

eBPF优化Linux网络性能

传统优化技术

NAPI

当数据包到达网卡的时候产生中断,驱动程序通知网络子系统有新的数据包到来,这时不是立即去处理,而是以轮询方式进行处理。

在NAPI中有pool方法来一次性接收多个数据。驱动程序不再使用数据包接收队列,而是网卡本身维护用来保存接收数据的缓冲区,并且可以禁止中断。该方法减少了中断产生,在突发的情况下,减少丢包的可能性,避免了接收队列的饱和,进而提高了网络性能。

GRO、RSS、RPS、XPS、RFS

GRO是在接收数据包的时候通过合并足够类似的包来减少传送给网络栈的包数,即将接收到的一些很小的包合并为一个大包送到协议栈,进而来减少cpu的使用量提高性能。

RSS是一种高效的网卡驱动技术。他能够在多处理器的系统下使接收报文在多个cpu之间高效的分发,相当于cpu收包的负载均衡。

RPS是SS的软件实现,使用软件的方法实现接收的报文在CPU之间平均分配,利用报文的哈希值找到匹配的CPU将报文送到对应CPU对应的backlog队列进行下一步的处理。

XPS相较于RPS,它是软件支持的发送数据包的多对列。XPS软件主要支持发送数据。

RFS的目标是通过指派处理报文程序所在的CPU。来在内核中处理报文,那么用方式来增加CPU的缓存命中率。

DPDK

如果在内核中没有DPDK,那么用户态收发数据就将数据放到内核协议栈经过一系列的处理,再到物理层网卡进行发送和接收数据。

DPDK用户态进行了实现,在用户态有DPDK的库。它实现了内核里面的协议站的功能,这时候就可以在用户态直接进行处理,将数据包处理好,直接放到物理层将数据发送出去。实际上就是将内核协议栈进行了短路,进而提高了网络性能。

优点:绕过了内核协议栈,提升了性能。

缺点:因为不走内核协议栈,传统的工具没法跟踪传统工具。

XDP

XDP为Linux内核提供了高性能可编程的网络数据路径。XDP需要网卡支持的,如果网卡支持那么网卡驱动程序里面有内置的bpf钩子,它可以访问原始的网络数据帧,直接告诉网卡对数据包的下一步操作。这么做避免了TCP/IP协议栈处理产生的额外消耗,通过驱动层做相关工作来提升性能。

XDP VS DPDK

XDP应用场景非常丰富,常见的有DDoS防御、负载均衡、SDR、网络统计、防火墙等。

XDP应用Cilium

它是基于eBPF的开源项目。其目的是为了微服务环境提供网络负载均衡安全功能。他主要的场景是在微服务、容器中。

在网络方面,可以用Cilium来作为容器的网络方案。以k8s集群为例,南北向流量就指当外部网络如果要访问k8s集群的时候就通过Ingress来访问。如果说是在集群内部,有很多Node节点节点,每个节点里面有很多个Pod,每个Pod有很多个容器。那么他们整个集群里面进行互相访问和互联互通的网络流量,我们就成为东西向的流量。

k8s并没有去实现网络,而是定义了模型。各大厂商就自己去做了网络的CNI插件。比如说Cilium它可以作为网络的CNI插件,它可以实现在集群内部Node与Node之间,Pod与Pod之间,容器与容器之间,或者不同的pod不同的Node之间的网络访问。

对于安全方面,它是基于Identity做的安全,传统的安全基于ip+port,而Cilium给服务指定了Identity允许Service Lable来定义安全策略。

最后Cilium还可以做监控,在集群里部署Cilium的CNI插件就可以监控整个集群。

CIlium性能

下图左边为传统网络,右边Cilium。

在传统的网络方案中,两个微服务之间要通信的话会经过Sidecar Poxy代理,他的数据走向看起来很短,实际上他走了完整的协议栈,而且在协议栈中还有iptables它里面维护了大量的规则,非常损耗性能。

而Cilium将两个socket以短路的方式连接到了一起,绕过了协议栈直接在两个socket之间进行拷贝数据。从直观上来看,它的性能提升是非常大的。

下图是几种方法之间的性能比较,Cilium每秒处理请求数比传统方法效率成倍增加。

eBPF提取内核网络数据

eBPF能做什么

eBPF在跟踪,观测,安全,网络,技能调优方面都大有可为。

  • 跟踪:比如要跟踪Linux内核里面的某个函数,我们想要知道这个函数调用了多少次,编写类似于Kprobe,Tracepoint这种类型的BPF程序用来跟踪内核的函数。
  • 观测:编写eBPF程序来提取内核的一些数据。
  • 安全:比如用eBPF程序抵御DDoS攻击。
  • 网络:比如上面说的Cilium。
  • 性能调优:用eBPF来提取细粒度的数据,然后通过数据做一些性能调优工作。

谁在使用eBPF

  • FaceBook他们用eBPF重写了他们大部分的基础设施。比如使用eBPF重写了iptable和netfilter。他们的负载均衡也从Ipvs换成了BPF。

  • 谷歌使用eBPF做Profiling,找出在分布式系统中应用消耗了多少cpu。他们也开始将BPF的应用范围扩展到了流量优化和网络安全。

  • RedHat用BPF做了bpfilter。它会替换掉内核中的iptables。

eBPF跟踪内核原理

eBPF可以使用c、gobpf、BCC、bpftrace进行编写。常用的是BCC和bpftrace其中bpftrace就是在命令行就可以用一些很简短的一些命令来达到一个bpf观测的一个效果,BCC作为工具集,他是一个BPF的前端将bpf的一些api进行了更上一层的封装,就是你可以用python来做这些工作。

BCC程序通过LLVM和Clang将BPF程序编译成bpf字节码,通过bpf系统调用将bpf字节码注入内核中。其中bpf字节码首先经过安全验证检查防止写的bpf程序破坏内核,JIT将bpf字节码翻译成机器能识别的机器码注入内核。当我们监控的内核函数触发就去执行eBPF程序,其原理是当你监控函数执行的时候会在入口处做一个类似于中断替换,转去执行BPF程序,执行结束后回到刚才跳转处继续执行函数。

在eBPF机制中有BPF Map共享空间,可以被内核和用户同时访问,eBPF程序将提取出数据放入Map中用户从中拿到数据进行观测。

TCP协议收发数据关键函数执行流

下图是TCP协议收发数据流,左边是协议栈数据接收过程,右边是发送过程。下一节演示如何提取内核进程级TCP流量数据。

在TCP数据发送的时候,tcp_sendmsg是流量发送的一个必经之路,该函数的第三个参数中就有它的流量信息。

在TCP数据接收的时候,tcp_recvmsg是流量接收必经之路,该函数的第三个参数中就有它的流量信息。。

使用kprobe进行函数挂载,在数据报经过时函数触发BPF函数将数据放入Map中,用户态将数据从Map中进行提取展示。相较于tcp_recvmsg,tcp_cleanup_rbuf的执行次数会远远小于tcp_recvmsg减少了BPF程序触发次数所带来的开销,所以此处改为tcp_cleanup_rbuf为挂载点。

运行展示

通过下方视频链接可以更直观感受eBPF运行流程:

https://www.bilibili.com/video/BV1ch411U75f?p=4&spm_id_from=pageDriver

可视化展示eBPF提取的数据

  • eBPF Exporter 是一个将自定义BPF跟踪数据导出到Prometheus的工具。可以将你的BPF程序嵌入在yml配置文件里面。然后执行Ebpf-exporter的时候加载这个配置就可以执行eBPF程序,然后将提取的数据通过一个端口暴露出来。

  • Prometheus 是一个高扩展性的监控和报警系统,可以主动将暴露出来数据进行拉取存储展示。

  • Grafana 是一个用来展示各种各样数据的开源软件,它的图表非常丰富。

操作展示

通过下方视频链接可以更直观感受eBPF数据可视化展示:

https://www.bilibili.com/video/BV1ch411U75f?p=4&spm_id_from=pageDriver

学习资料

《Linux内核观测技术BPF》

《BPF之巅:洞悉Linux系统和应用性能》

《Systems Performance》

《BPF Performance Tools》

https://www.tcpdump.org/papers/bpf-usenix93.pdf

https://www.brendangregg.com/index.html

Cilium eBPF:https://ebpf.io

https://github.com/iovisor/bcc

end



一口Linux 


关注,回复【1024】海量Linux资料赠送

精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图



【课程推荐】

针对应届生和转行的朋友,彭老师录制了基于Linux的物联网综合实战课程。以项目为基础讲解知识点,掌握就有2年以上工作经验。
  课程详情:《一个适合写到简历的基于linux的物联网综合项目
报名联系:yikoupeng(微信号)
课程报名及开发板购买,后台回复关键字:无线传感网


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看

一口Linux 写点代码,写点人生!
评论
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 63浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 98浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 125浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 40浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 103浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 80浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 66浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 167浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 170浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 180浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 113浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 83浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 141浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦