佳能|一文详解用 eBPF 观测 HTTP

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片

佳能|一文详解用 eBPF 观测 HTTP

文章图片



前言 随着eBPF推出 , 由于具有高性能、高扩展、安全性等优势 , 目前已经在网络、安全、可观察等领域广泛应用 , 同时也诞生了许多优秀的开源项目 , 如Cilium、Pixie等 , 而iLogtail 作为阿里内外千万实例可观测数据的采集器 , eBPF 网络可观测特性也预计会在未来8月发布 。 下文主要基于eBPF观测HTTP 1、HTTP 1.1以及HTTP2的角度介绍eBPF的针对可观测场景的应用 , 同时回顾HTTP 协议自身的发展 。
eBPF基本介绍 eBPF 是近几年 Linux Networkworking 方面比较火的技术之一 , 目前在安全、网络以及可观察性方面应用广泛 , 比如CNCF 项目Cilium 完全是基于eBPF 技术实现 , 解决了传统Kube-proxy在大集群规模下iptables 性能急剧下降的问题 。 从基本功能上来说eBPF 提供了一种兼具性能与灵活性来自定义交互内核态与用户态的新方式 , 具体表现为eBPF 提供了友好的api , 使得可以通过依赖libbpf、bcc等SDK , 将自定义业务逻辑安全的嵌入内核态执行 , 同时通过BPF Map 机制(不需要多次拷贝)直接在内核态与用户态传递所需数据 。

当聚焦在可观测性方面 , 我们可以将eBPF 类比为Javaagent进行介绍 。 Javaagent的基本功能是程序启动时对于已存在的字节码进行代理字节码织入 , 从而在无需业务修改代码的情况下 , 自动为用户程序加入hook点 , 比如在某函数进入和返回时添加hook点可以计算此函数的耗时 。 而eBPF 类似 , 提供了一系列内核态执行的切入点函数 , 无需修改代码 , 即可观测应用的内部状态 , 以下为常用于可观测性的切入点类型:
kprobe:动态附加到内核调用点函数 , 比如在内核exec系统调用前检查参数 , 可以BPF 程序设置 SEC(\"kprobe/sys_exec\")头部进行切入 。tracepoints:内核已经提供好的一些切入点 , 可以理解为静态的kprobe , 比如syscall 的connect函数 。uprobe:与krobe对应 , 动态附加到用户态调用函数的切入点称为uprobe , 相比如kprobe 内核函数的稳定性 , uprobe 的函数由开发者定义 , 当开发者修改函数签名时 , uprobe BPF 程序同样需要修改函数切入点签名 。perf_events:将BPF 代码附加到Perf事件上 , 可以依据此进行性能分析 。