open-telemetry/opentelemetry-ebpf-profiler
GitHub: open-telemetry/opentelemetry-ebpf-profiler
一个基于 eBPF 的低开销、全系统、跨语言生产级性能分析器,实现了 OpenTelemetry Profiles 信号协议。
Stars: 3069 | Forks: 389
# 介绍
本仓库通过 eBPF 实现了一个适用于 Linux 的全系统、跨语言 Profiler(性能分析器)。
## 核心功能与优势
- 实现了 [Alpha OTel Profiles signal](https://github.com/open-telemetry/opentelemetry-proto/pull/775)
- 极低的 CPU 和内存开销(测试中的上限为 1% CPU 和 250MB 内存,Agent 通常能保持在远低于此的水平)
- 支持原生 C/C++ 可执行文件,无需 DWARF 调试信息(利用 `.eh_frame` 数据,如 [US11604718B1](https://patents.google.com/patent/US11604718B1/en?inventor=thomas+dullien&oq=thomas+dullien) 所述)
- 支持对**没有帧指针** 且**主机上没有调试符号** 的系统库进行分析。
- 支持运行时之间的混合堆栈跟踪 —— 堆栈跟踪从内核空间穿过未经修改的系统库,一直延伸到高级语言。
- 支持原生代码(主机上无调试符号的 C/C++、Rust、Zig、Go 等)
- 支持广泛的高级语言(HLL),如 Hotspot JVM、Python、Ruby、PHP、Node.JS、V8、Perl、Erlang 和 .NET。
- 100% 非侵入式:无需将 Agent 或库加载到被分析的进程中。
- 无需对 HLL 解释器和 VM 进行任何重新配置、插桩或重启:Agent 支持在默认配置下对每种受支持的语言进行栈回溯。
- 除 .NET 外,所有栈回溯器均支持 ARM64。
- 支持原生 `inline frames`(内联帧),这有助于深入了解编译器优化并提供更精确的函数调用链。
## 构建
我们已将 Profiler 作为 Receiver 集成到 [OTel Collector](https://opentelemetry.io/docs/collector/) 中,这是今后[支持的配置](https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-ebpf-profiler)。
为了辅助开发、测试和调试,我们还提供了名为 `ebpf-profiler` 的独立分析 Agent 二进制文件,以及 OTel Collector 分析 Receiver 二进制文件的本地构建版本(`otelcol-ebpf-profiler`)。这些二进制文件不受任何支持,未来可能会被移除,不应部署在生产环境中。
## 平台要求
可以使用提供的 make 目标构建 Agent。容器化构建需要 Docker,支持 amd64 和 arm64 架构。
对于 **Linux**,请执行以下步骤:
1. 为当前机器的架构构建 Agent:
make agent
或者使用 `make debug-agent` 进行调试构建。
2. 交叉编译到不同的架构(例如 arm64):
make agent TARGET_ARCH=arm64
生成的二进制文件将在当前目录下命名为 `ebpf-profiler`。
## 其他操作系统
由于 Profiler 仅支持 Linux,macOS 和 Windows 用户需要设置 Linux VM 来构建和运行 Agent。如果使用交叉编译,请确保指定了正确的架构。在 VM 中配置好 Linux 环境后,请使用与上述相同的 make 目标。
## 支持的 Linux 内核版本
[7ddc23ea](https://github.com/open-telemetry/opentelemetry-ebpf-profiler/commit/7ddc23ea135a2e00fffc17850ab90534e9b63108) 是最后一个支持 4.19 的提交。此提交之后的更改可能需要最低 Linux 内核版本 5.4。
### 更新支持的 Linux 内核版本
该项目保持其最低支持的内核版本与当前主要积极维护的 Linux 发行版(包括 Debian stable、Red Hat Enterprise Linux、Ubuntu LTS、Amazon Linux 和 SUSE Linux)提供的最低内核版本一致。当所有此类发行版不再提供特定内核版本时,可能会提高最低要求。这种方法使代码库能够利用更新的 eBPF 功能,并避免为过时的内核维护兼容性垫片。
需要注意的是,某些发行版将来自更新内核的 eBPF 功能整合到了其支持的版本中。发生这种情况时,发行版声明的内核版本不能准确反映其真实的 eBPF 能力,也不会阻止我们提高最低支持版本。在此类内核上,可以使用 `no-kernel-version-check` 配置选项绕过检查并允许 Profiler 执行。
## 替代构建(不使用 Docker)
您可以通过直接安装 Dockerfile 中列出的依赖项来构建 Agent。依赖项设置完成后,只需运行:
```
make
```
或
```
make debug
```
这将在您的机器上本地构建 Profiler。
## 本地构建 `otelcol-ebpf-profiler`(不使用 Docker)
您可以通过运行以下命令构建本地 `otelcol-ebpf-profiler` 二进制文件:
```
make otelcol-ebpf-profiler
```
或交叉编译到不同的架构(例如 arm64):
```
make otelcol-ebpf-profiler TARGET_ARCH=arm64
```
有关示例配置,请参阅 [local.example.yml](https://github.com/open-telemetry/opentelemetry-ebpf-profiler/blob/main/cmd/otelcol-ebpf-profiler/local.example.yaml)。
## 运行
您可以使用以下命令启动 Agent:
```
sudo ./ebpf-profiler -collection-agent=127.0.0.1:11000 -disable-tls
```
要启动 OTel Collector 分析 Receiver,请运行:
```
sudo ./otelcol-ebpf-profiler --feature-gates=+service.profilesSupport --config cmd/otelcol-ebpf-profiler/local.example.yaml
```
该 Agent 包含最近发布的 Alpha OTel Profiles [signal](https://github.com/open-telemetry/opentelemetry-proto/pull/775) 的功能性但仍在进行中/不断发展的实现。
Agent 加载 eBPF 程序及其映射,开始栈回溯并将捕获的跟踪报告给后端。
## 开源后端
由于 OTel Profiles signal 仍处于开发阶段,成熟的面向生产环境的后端尚未出现。为了加速开发和实验,Elastic 开源了一个名为 [devfiler](https://github.com/elastic/devfiler) 的桌面应用程序,它重新实现了 eBPF Profiler 的后端(收集、数据存储、符号化和 UI)部分。请注意,devfiler 不是真正的生产后端,不应作为此类后端使用。它仅用于测试、实验和开发。
## 开发
要了解该项目的工作原理并了解有关分析的更多信息,请查看 [Profiling internals](doc/internals.md)
# 法律信息
## 许可信息
本项目根据 Apache License 2.0 (Apache-2.0) 授权。
[Apache License 2.0](LICENSE)
eBPF 源代码根据 GPL 2.0 许可证授权。
[GPL 2.0](support/ebpf/LICENSE)
## 依赖项许可证
要显示依赖项许可证的摘要:
```
make legal
```
标签:API集成, APM, ARM64, C/C++, Docker镜像, EVTX分析, GET参数, Go, NodeJS, Observability, OpenTelemetry, OpenVAS, OTel, Perl, PHP, Profiling, Python, Ruby, Ruby工具, Rust, 事务性I/O, 低开销, 全系统分析, 内核追踪, 可观测性, 安全渗透, 性能分析, 数据中心, 无侵入式, 无后门, 无需插桩, 日志审计, 混合栈追踪, 生产环境, 监控代理, 知识库, 网络流量审计, 调用栈, 调试符号, 跨语言