基于 eBPF 的 Linux 可观测性

本文介绍了eBPF作为Linux监控的强大框架,它是BPF的增强版,允许在内核中安全执行自定义代码。eBPF用于Linux监控的原因包括其稳定性、低开销和灵活性,可以跟踪内核的多个子系统。文章通过例子展示了如何构建和加载eBPF程序,并讨论了使用Go语言和eBPF Maps进行内核交互的方法。
摘要由CSDN通过智能技术生成

最近发布的 Linux 内核带了一个针对内核的能力强大的 Linux 监控框架。它起源于历史上人们所说的的 BPF。

BPF 是什么?

BPF (Berkeley Packet Filter) 是一个非常高效的网络包过滤机制,它的目标是避免不必要的用户空间申请。它直接在内核空间处理网络数据包。BPF 支持的最常见的应用就是 tcpdump 工具中使用的过滤器表达式。在 tcpdump 中,表达式被编译转换为 BPF 的字节码。内核加载这些字节码并且用在原始网络包流中,以此来高效的把符合过滤条件的数据包发送到用户空间。

eBPF 又是什么?

eBPF 是对 Linux 观测系统 BPF 的扩展和加强版本。可以把它看作是 BPF 的同类。有了 eBPF 就可以自定义沙盒中的字节码,这个沙盒是 eBPF 在内核中提供的,可以在内核中安全的执行几乎所有内核符号表抛出的函数,而不用担心搞坏内核。实际上,eBPF 也是加强了在和用户空间交互的安全性。在内核中的检测器会拒绝加载引用了无效指针的字节码或者是以达到最大栈大小限制。循环也是不允许的(除非在编译时就知道是有常数上线的循环),字节码只能够调用一小部分指定的 eBPF 帮助函数。eBPF 程序保证能及时终止,避免耗尽系统资源,而这种情况出现在内核模块执行中,内核模块会造成内核的不稳定和可怕的内核奔溃。相反的,你可能会发现和内核模块提供的自由度来比,eBPF有太多限制了,但是综合考虑下来还是更倾向于 eBPF,而不是面向模块的代码,主要是基于授权后的 eBPF 不会对内核造成损害。然而这还不是它唯一的优势。

为什么用 eBPF 来做 Linux 监控?

作为 Linux 内核核心的一部分,eBPF 不依赖于任何第三方模块或者扩展依赖。它包含了稳定的 ABI(应用程序二进制接口),可以让在老内核上编译的程序在新内核上运行。由 eBPF 带来的性能开销通常可以忽略不计,这让它非常适合做应用监控和跟踪很重的系统执行。窗口用户没有 eBPF,但是他们可以使用窗口事件跟踪。

eBPF 是非常灵活而且可以跟踪几乎所有的主要内核子系统:涵盖了 CPU 调度,内存管理,网络,系统调用,块设备请求等等。而且仍然在扩展中。

可以在终端里运行下面的命令看到所有能用 eBPF 跟踪的内核符号列表:

$ cat /proc/kallsyms

 可以跟踪的符号

The above command will produce a huge output. If we were only interested in instrumenting syscall interface, a bit of grep magic will help filter out unwanted symbol names:

$ cat /proc/kallsyms | grep -w -E “sys.*”
ffffffffb502dd20 T sys_arch_prctl
ffffffffb502e660 T sys_rt_sigreturn
ffffffffb5031100 T sys_ioperm
ffffffffb50313b0 T sys_iopl
ffffffffb50329b0 T sys_modify_ldt
ffffffffb5033850 T sys_mmap
ffffffffb503d6e0 T sys_set_thread_area
ffffffffb503d7a0 T sys_get_thread_area
ffffffffb5080670 T sys_set_tid_address
ffffffffb5080b70 T sys_fork
ffffffffb5080ba0 T sys_vfork
ffffffffb5080bd0 T sys_clone

不同类型的钩子点负责对不同内核模块触发的事件作出响应。内核程序运行在指定的内存地址上,网络数据包的流入或者用户空间代码的调用执行都是可以通过 eBPF 程序跟踪的,通过给 kprobes,XDP 下发 eBPF 可以跟踪进入的网络包,给 uprobes 下发 eBPF 可以跟踪用户空间程序调用。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值