在无BTF的内核中使用fd寻找关联的socket结构

上一篇文章讲了eBPF Tracepoint和Kprobe,这一篇文章我们来看一下如何应对无BTF的老版本内核,以及如何只使用fd寻找关联的socket结构。 这篇文章的大背景,是需要关联fd、socket结构体指针,以便能够在hook系统调用时,通过fd找到对应的五元组信息。但是问题就在于,尝试了众多方法来关联上述的数据,甚至hook了十几个内核函数,希望包围socket的全生命周期,但是最终都出现了意料之外的结果,非常棘手。 ...

2023-08-22

使用eBPF Tracepoint和Kprobe跟踪内核活动

简介 eBPF老生常谈了,这里就不多介绍了,我们直接来看看Tracepoint和Kprobe。 Kprobe是Linux内核中的一个功能,可以实现无感知、动态切入任何内核活动中,并且收集调试和性能信息,一个很典型的使用案例就是切入内核的某个函数中并且获取传入参数和返回值。Kprobe共有两个类型,一个是Kprobe,一个是Kretprobe,他们都被统称为probes,前者用于切入内核函数并且获取传入参数,后者用于切入内核函数并且获取返回值。早期的Kprobe是以内核模块的形式开发,错误的操作会直接导致模块panic,并且可能会影响内核运行的稳定性,而如今,这些代码可以简化成eBPF代码,经过内核的检查才会装入BPF虚拟机中运行,也会限制能够访问的内存、内核函数,这虽然造成了一定的使用不便,但是大幅提高了安全性,也降低了使用难度。 ...

2023-08-21

基于eBPF的Continuous Profiler如何解析符号表?

最近看了两个项目pyroscope1和parca2,这两个都是开源的可观测项目。pyroscope实现了基于eBPF的无侵入观测能力,鉴于parca实现得不是非常优雅(至少我用着觉得非常难受),本文就单纯从pyroscope展开分析了。由于当下eBPF实现Stack Trace等功能已经有了非常多的案例,本文就不再提如何使用eBPF做Continuous Profiler3了,我们单纯来看看最核心的一个内容——符号名称是怎么解析出来的(也就是如何解析符号表的)? 开源项目如何实现 pyroscope中,为了能够实现对ELF文件符号表的解析,其借助Go语言的cgo实现了一个binding来调用bcc的bcc_syms.h,并对其进行封装,实现的这个包就叫做symtab。 ...

2022-11-08

使用Linux内核的ftrace跟踪eBPF问题

好久没写文章了,最近忙于各种事情,再加上过年放假学习,计划文章队列排的老长了。在此,新年第一篇文章,就先祝一下大家新年快乐哈~ eBPF香是香,但是竟然还有内核不支持?博主最近遇到了这么个情况,eBPF程序死活无法加载,始终报出Invalid argument的错误,为了解决这个问题,博主我花了好多天时间排查,跟踪了Linux内核的调用链,最后发现,问题竟然是…(实在想不到好的开头了) ...

2022-02-15

重构——让XDP为轻量SDN数据面再加速

上一篇文章我们一块来看了eBPF XDP的性能之路和场景,文中对于Ring也进行了简单的描述,但是真正当我重构起来那个包时,这么多的Ring究竟在内存中的哪个位置?哪些数据之间又是重叠的?本篇文章,我们就来顺腾摸瓜,看看这玩意更低层级是什么样子的。 ...

2021-11-14

解读eBPF XDP性能之路:它如何向着DPDK看齐?它在实际中又能带来多大效益?

相信使用过Linux的AF_PACKET类型socket的朋友都知道,性能不是特别好,而且似乎引入了一个新的问题——用户态程序要处理所有来的报文(可能也能绑定socket,博主我没有尝试过),这应该是相当拉胯了。使用eBPF XDP处理完美解决所有问题,还附带了UMEM共享内存,省掉了不少CPU时钟,不仅能解决云原生场景下的一些性能和潜在问题,还能顺带做个SD-WAN,能不香吗?(手动狗头 ...

2021-11-07