1.【eBPF】使用libbpf开发eBPF程序
2.Linux 内核观测技术BPF
3.为什么k8s管理员要懂eBPF
4.高性能BPF内存分析工具解析
5.Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
6.eBPF 程序编写 - libbpf
【eBPF】使用libbpf开发eBPF程序
libbpf是内核提供的功能库,学习它有助于理解如bcc/bpftrace等工具。eBPF程序的运行流程包括生成字节码、加载字节码到内核中,并将其attach到特定事件或函数。此外,php文件统计源码创建map实现内核态与用户态间的数据交互。当事件或TP点触发时,调用attach的eBPF字节码执行其功能。
本文示例为统计一段时间内syscall调用次数,包含如下项目文件结构:
在字节码生成阶段,有多种方式实现。本文采用clang进行编译,创建eBPF程序。在编译过程中,需注意几个关键点:内核源码的使用、单独构建的libbpf库和bpftool,以及使用-g -O2选项以避免加载时的错误。
使用libbpf库加载eBPF程序的步骤如下:需要内核头文件支持,从内核源码中安装至当前目录。整个工程目录应包含libbpf库依赖的libelf和libz库,因此需要进行交叉编译相关库。编译用户态eBPF加载程序时,需链接之前编译好的依赖库。在内核开启相关功能的情况下,加载程序后,即可启动虚拟机并运行,以开始调试内核bpf模块功能。
Linux 内核观测技术BPF
Linux内核中的观测技术BPF,简称伯克利数据包过滤器,最初是为了提升网络包过滤性能而设计的。随着时间发展,BPF演变为一个通用执行引擎,可在系统和应用程序事件触发时运行定制代码,让内核具备高度可编程性。BPF由指令集、开奖平台源码存储对象和辅助函数构成,具备两种执行机制:解释器和即时编程器,执行前需通过验证器安全检查。
BPF验证器是关键环节,确保只有经过审查的代码才能在内核中运行。它通过静态分析和指令预执行检查来保证程序安全,避免死循环和内存访问错误。尾部调用允许BPF程序之间进行协作,但信息共享需借助BPF映射,BPF映射是一种在内核和用户空间之间共享数据的机制。
要使用BPF,推荐升级到5系内核,通过命令获取系统版本或源码,然后安装依赖环境。BPF程序通常用C语言编写,通过LLVM编译成内核可执行的代码。例如,可以编写一个在execve系统调用时输出"Hello, World, BPF!"的程序。
BPF映射是持久化的,但4.4版本之前有指令数量限制,5.2版本后有所放宽。创建映射需要调用bpf_create_map系统调用,映射类型包括哈希表等。BPF提供了CRUD操作,如插入、查找和删除元素,以及遍历映射的功能。
BPF还支持跟踪和探针功能,用于收集数据进行分析和调试。内核探针在指令执行时插入代码,用户空间探针则在用户程序特定指令执行时触发。例如,可以使用Python和BPF进行内核命令名称跟踪或使用Go语言编写用户空间探针统计函数执行时间。
在使用BPF过程中,可能遇到如“Option ‘openmp-ir-builder-optimistic-attributes’ registered more than once!”这类问题,缩短链接源码解决方法是重新编译BCC。以上就是Linux内核观测技术BPF的详细介绍和相关操作示例。
为什么k8s管理员要懂eBPF
eBPF的引入为容器和Kubernetes集群的观测性带来了革命性的变化。它允许程序直接在Linux内核空间中运行,提供了高效、安全且功能强大的方式来控制、过滤和监控流量。eBPF的崛起并非偶然,而是与Docker和Kubernetes的发展紧密相关。本文旨在深入探讨eBPF的来龙去脉,以及为什么它在Kubernetes可观测性中变得如此重要。
eBPF,全称为"extended Berkeley Packet Filter",是对老式伯克利包过滤器BPF的扩展。BPF最初于年引入,用于为Linux内核提供可编程、高效的虚拟机,以控制和过滤流量。然而,随着容器技术的兴起,特别是Docker的普及,BPF的原始架构变得越来越局限。eBPF于年引入,通过提供在Linux内核空间中运行的工具,极大地扩展了BPF的原始架构。这使得eBPF在容器和Kubernetes环境中变得尤为重要。
在内核空间中运行程序意味着代码能以更高的效率执行,并且能访问底层内核资源,否则从用户空间访问这些资源会非常复杂且昂贵。此外,eBPF允许你观察用户空间中运行的任何程序,这为容器世界提供了一种无价的技术能力。使用eBPF,你可以在磁盘I/O等事件上运行小程序,这些事件在内核的springboot源码request安全虚拟机中运行。
在使用内核模块之前,eBPF提供了更简单、更高效、更安全的解决方案。内核模块的部署复杂,存在依赖关系,并且可能不安全。与之相比,eBPF允许自定义程序在独立的内核级虚拟机中运行,无需处理内核模块依赖,接触内核源代码,甚至无需拥有root权限。这使得eBPF成为一种灵活且易于部署的解决方案。
一旦部署了eBPF程序,你就可以监视你附加的任何代码流,无论是在内核空间、用户空间还是两者都有。eBPF映射或预定义的文件描述符允许你访问程序的输入和输出,从而实现对网络流量的细粒度可见性。在云原生世界中,eBPF为可观测性解锁了无限可能性。
为了部署eBPF程序,你需要完成以下步骤:编写和编译代码(通常使用限制性C语言),然后将字节码传递给内核检验器以确保程序的可靠性。加载并验证后,程序就可以执行,监视数据包的进入或发送,然后映射到主机上运行的进程或容器。这提供了对网络流量的深入洞察。
eBPF的生态系统正在快速发展,包括工具链、编译器和与eBPF程序交互的项目,如Python、Golang和Rust。这些工具简化了eBPF的源码下载jtcms使用,降低了开发门槛,使得即使是缺乏动力的开发者也能轻松编写和加载eBPF程序。
尽管eBPF带来了许多优势,但也有其局限性。编写符合内核检验器的eBPF程序可能具有挑战性,且风险在于程序在不同内核版本之间可能不一致。eBPF程序在堆栈空间上受到限制,需要高效地编写代码。此外,不同Linux发行版之间的内核版本和自定义可能导致eBPF程序的可移植性问题。
展望未来,eBPF的生态系统正变得更加成熟和组织化,得到了来自大型科技公司的支持。随着eBPF基金会等组织的推动,可以预见eBPF将在Kubernetes可观测性中发挥关键作用。因此,Kubernetes管理员和开发人员应开始学习使用eBPF,以充分利用其在监控和理解容器内部事件方面的潜力。
高性能BPF内存分析工具解析
Linux内核与CPU处理器协同工作,将虚拟内存映射到物理内存,以提升效率。内存管理通过创建内存映射的页组来实现,每页大小根据处理器实际情况设定,通常为4 KB。内核从页空闲列表分配物理内存页,优化分配策略以提高效率。分配器如slab分配器从空闲列表使用内存。
典型的内存页面管理过程包括申请、分配、存储和释放。繁忙应用中,用户层内存分配频繁,指令执行和MMU查找大量发生,对内存管理构成挑战。系统通过定期激活kswapd,检查空闲与活跃页面,释放内存以应对内存压力。kswapd协调后台页面召回,降低性能影响,但可能引起CPU和磁盘I/O竞争。当内存回收受限,分配将被阻塞,并同步等待内存释放。内核shrinker函数触发直接回收,释放内存,减少缓存占用。
内存不足时,swap设备提供解决方案,允许进程继续分配内存,将不常用页面交换至swap,但会导致性能下降。关键系统倾向于避免使用swap,以防止内存不足导致进程被杀。内存不足情况下,oom killer作为内存释放的最后手段,通过规则选择牺牲进程。通过调整系统和进程配置,优化内存管理。
随着内存碎片化加剧,内核启动页面压缩与移动,释放连续内存空间。Linux文件系统利用空闲内存缓存数据,通过调整参数vm.swappiness,系统可以选择从文件缓存或swap释放内存。传统性能工具提供内存使用统计,但分析内存使用情况需要更深入理解,如page fault率、库分配等。BPF工具如kmem、kpages、slabratetop、numamove,以及oomkill和memleak,通过更高效、性能损耗更低的方式进行内存分析。
BPF相关工具提供内存分析能力,包括跟踪内存分配与释放事件、检测内存泄漏等。oomkill用于监控并打印oom killer事件详细信息,memleak跟踪内存分配与释放,辅助内存问题诊断。BPF工具为内存管理提供强大支持,结合源代码分析,可有效识别并解决内存问题。
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
C++后台开发,也称为C++/Linux服务器开发,在BAT公司中拥有众多职位,其中鹅厂对C++后台开发岗位的需求尤为迫切。尽管该岗位对技术要求较高,但追求大厂工作的朋友仍可积极争取。
对于具有C/C++语言基础的朋友来说,在面试后台岗位时,常常会疑问:面试大厂时,技术水平需达到何种程度才能入职?以下是针对校招和社招的不同要求。
对于校招,技术层面的要求相对较低。掌握C with STL以及常见的数据结构与算法,且能完成leetcode中等难度以下题目的笔试者,已有分。如果对STL、auto、lambda等用法熟练,还能加分。对于实习生来说,良好的表现即可被录用,之后会再进行网络编程和Linux方面的培训。
因此,校招更看重的是基础和学习能力。实习期间,会根据技术学习进度决定是否发放offer。当然,如果提前掌握Linux环境编程、网络编程等技术,更能加分,因为各个赛道都有内卷现象。
对于社招,C++后台开发岗位的核心技术点有三个:代码能力、架构能力、安全能力及工程素养。掌握这三方面的技术,面试通过的概率较高。至于在大厂的职级体系中确定自己的岗位,会有更加细化的标准。
不熟悉的朋友,可以先领取一份Linux c/c++开发新手学习资料包(入坑不亏):LinuxC++后台开发文档视频+代码资料学习路线免费领取
Linux C/C++开发1、精进基石专栏
(一)数据结构与算法
(二)设计模式
(三)c++新特性
(四)Linux工程管理
2、高性能网络设计专栏
(一)网络编程异步网络库zvnet
(二)网络原理
(三)自研框架:基于dpdk的用户态协议栈的实现(已开源)
3、基础组件设计专栏
(一)池式组件
(二)高性能组件
(三)开源组件
4、中间件开发专栏
(一)Redis
(二)MySQL
(三)Kafka
(四)Nginx
5、开源框架专栏
(一)游戏服务器开发skynet (录播答疑)
(二)分布式API网关
(三)SPDK助力MySQL数据落盘, 让性能腾飞(基础设施)
(四)高性能计算CUDA (录播答疑)
(五)并行计算与异步网络引擎workflow
(六)物联网通信协议mqtt的实现框架mosquitto
6、云原生专栏
(一)Docker
(二)Kubernetes
7、性能分析专栏
(一)性能与测试工具
(二)观测技术bpf与ebpf
(三)内核源码机制
8、分布式架构
(一)分布式数据库
(二)分布式文件系统(录播答疑)
(三)分布式协同
9、上线项目实战
(一)dkvstore实现(上线项目)
(二)图床共享云存储(上线项目)
(三)容器化docker部署
(四)零声教学AI助手一代(上线项目)
(五)魔兽世界后端TrinityCore (上线项目)
、适宜的工程师人群(共分为8大群体)
、配套书籍资料
以上是系统学习课程大纲,需要系统学习或者领取视频资料点下方腾讯文档领取
如果想在大厂快速提升C/C++开发方向的能力,这份学习体系是大家绕不过的具有参考意义的提升路线。通过学习路线,可以对Linuxc/c++开发方向的技术栈有清晰的认识。
eBPF 程序编写 - libbpf
eBPF程序编写通过内核的bpf系统调用加载ebpf二进制,实现对MAP的增删改操作。ebpf源代码使用C语言编译生成bpf字节码。eBPF程序能够访问MAP,调用内核函数,访问内核与用户态内存,并进行计算与分支控制,但需避免死循环。
eBPF程序在加载后,与内核的特定hook点结合,被动执行,如tracepoint、kprobe、uprobe、cgroup等,提供高效的数据通信机制,如输出数据到perf_buffer或ringbuffer。
eBPF程序还能通过修改hook函数的返回值,实现函数劫持。但此功能仅适用于标有ERR_INJECT的函数。
libbpf作为辅助工具简化bpf编程,用户态与内核态逻辑分离,框架负责通信、加载与卸载bpf程序。它提供丰富的helper函数,并实现CO-RE,确保bpf程序跨内核版本运行。
libbpf通过记录relocation信息于bpf程序的.BTF section,配合clang编译bpf后端增加的builtin函数,实现程序跨内核版本运行。编译后,bpf程序以用户态可执行二进制形式存在,内核态程序作为ro数据段嵌入其中,形成独立可部署的文件。
libbpf的CORE方式相较于其他工具集有显著优势,例如bcc-tools工具集合采用libbpf重写。编写eBPF程序时,参照libbpf-bootstrap/examples/c模板,通常需要两个文件:BTF记录数据结构信息,确保程序在不同内核版本上运行的兼容性。
python抓包(sniff)-----实现wireshark抓包功能
学习技术应谨慎,确保合法合规使用。
安装scapy模块
通过命令行执行:python -m pip install scapy
scapy的sniff()函数用于数据嗅探。
关键参数包括:
iface:指定目标网络接口。
count:设定捕获数据包的数量上限,非0表示限制数量。
filter:配置流量过滤规则,使用BPF语法。
prn:定义回调函数,当数据包符合过滤规则时调用。
BPF过滤规则示例:
仅捕获特定IP交互流量:host ..1.
仅捕获特定MAC地址交互流量:ether src host ::df:::d8
仅捕获特定IP源流量:src host ..1.
仅捕获特定IP目的流量:dst host ..1.
仅捕获特定端口流量:port
排除特定端口流量:!port
仅捕获ICMP流量:ICMP
特定IP源且特定端口目的流量:src host ..1. && dst port
简单应用示例:
仅捕获源地址为..1.且目的端口为的流量。
注意:务必使用管理员权限运行命令行以获取网络访问权限。
为避免回调函数冗长,可定义callback()函数供prn调用。
捕获的数据包可以保存为pcap格式,使用wireshark工具分析。
完整工具源码运行效果:
注意:确保使用管理员权限运行命令行,否则可能无法访问网络接口。