本文地址:https://www.ebpf.top/post/ebpf_network_exporter
公有云网络问题,是一个老生常谈的事情了。今天主要简单说明下,在内网环境下去分析 & 定位这个问题。也并不是一开始就需要 eBPF 加持的,可以从简单的基础工具到监控配合去相关比较快速的定位问题,解决问题。下面会从发现问题到一步步配合使用 Or 开发一些简单的东西去解决问题的大致思路。
本文地址:https://www.ebpf.top/post/ebpf_network_exporter
公有云网络问题,是一个老生常谈的事情了。今天主要简单说明下,在内网环境下去分析 & 定位这个问题。也并不是一开始就需要 eBPF 加持的,可以从简单的基础工具到监控配合去相关比较快速的定位问题,解决问题。下面会从发现问题到一步步配合使用 Or 开发一些简单的东西去解决问题的大致思路。
图 1-1 为网络层内核收发核心流程图,在函数流程图中我们可以看到 Netfliter
在其中的位置(图中深色底纹圆角矩形)。图中对应的 hook
点有 5 个,每个hook
点中保存一组按照优先级排序的函数列表:
tracepoint
的介绍可以参见 Kernel 文档这里。从 Linux 内核 4.7 开始,eBPF 程序可以挂载到内核跟踪点 tracepoint
。在此之前,要完成内核中函数跟踪的工作,只能用 kprobes/kretprobe
等方式挂载到导出的内核函数(参见 /proc/kallsyms
),正如我们前几篇文章跟踪 open
系统调用方式那样。尽管 kprobes
可以达到跟踪的目的,但存在很多不足:
在上篇文章中我们为文件 open
系统调用采用了 perf_event
的方式将数据从内核上报至用户程序。但是到目前为止,我们只是实现了文件打开记录的跟踪,并没有对文件访问的结果是成功还是失败进行展示。
在上一篇 ”使用 ebpf 实时持续跟踪进程文件记录“ 中,我们简单介绍了使用 eBPF 跟踪文件打开记录的跟踪。为了简单演示功能,我们直接使用了 bpf_trace_printk
进行演示,正如上文所述,bpf_trace_printk
存在一些限制:
本文主要用于演示基于 ebpf 技术来实现对于系统调用跟踪和特定条件过滤,实现基于 BCC 的 Python 前端绑定,过程中对于代码的实现进行了详细的解释,可以作为学习 ebpf 技术解决实际问题的参考样例。
译者:范彬 原文地址:BPF ring buffer
当前 perf 缓冲区已成为从内核向用户空间发送数据的标准。BPF 环形缓冲区是一个新的BPF数据结构,解决了 BPF perf 缓冲区内存效率和事件重新排序的问题,同时性能达到或超过了 perf 缓冲区。 它既提供了与 perfbuf 兼容的功能,可轻松进行移植,又提供了具有更好可用性的新的 reserve / commit API。 综合基准和实际基准均表明,几乎所有情况下都应考虑将 BPF 环形缓冲区作为从 BPF 程序向用户空间发送数据的默认选择。
eBPF 是一项令人兴奋的强大技术,其允许开发者在 Linux 内核的核心处添加自定义代码功能,并且我们还可以通过编写简单的 C 或 Go 程序与加载到内核中的 eBPF 程序交互,用于加载或读取数据。运行在内核中的 BPF 程序可以检查所附加进程(或内核模块)的内存数据。为此,eBPF 程序需要确切了解处理涉及的数据结构类型,这可以通过 #include "vmlinux.h"
实现。在本中,我将详细介绍 vmlinux.h
是什么以及为什么你在编写 eBPF 程序开始就应该使用它。