前言
本文主要介绍 DeepFlow 的 AutoProfiling(on-cpu)持续性能剖析功能的配置与使用。该能力与 DeepFlow 的部署方式无关。自 v6.6.3 起,deepflow-agent 的配置格式有较大调整,本文使用新版本配置格式,建议使用 v7.0 LTS 或后续 LTS 版本。
CPU 剖析的配置与应用
前置条件
需要内核版本支持 eBPF 能力,DeepFlow 中开启 eBPF 能力(默认开启)所需内核版本要求如下:
体系架构发行版内核版本kprobe [1]Golang uprobeOpenSSL uprobeperfX86CentOS 7.93.10.0-940+ [2]YY [3]Y [3]YRedHat 7.63.10.0-940+ [2]YY [3]Y [3]Y*4.14 [4]YY [3]-Y*4.15YY [3]-Y*4.16YY-Y*4.17+YYYYSUSE 12 SP54.12 [5]YY-YARMCentOS 84.18YYYYEulerOS5.10+YYYY麒麟 KylinOS V10 SP14.19.90-23 [6]YYYY麒麟 KylinOS V10 SP24.19.90-25.24+ [7]YYYY麒麟 KylinOS V10 SP34.19.90-52.24+YYYY其他发行版5.8+YYYY对内核版本的补充说明:
- [1]:在 Linux 启用了 BTF(BPF Type Format)的情况下,X86 架构内核版本大于等于 5.5、ARM 架构内核版本大于等于 6.0 时,agent 将自动使用 fentry/fexit 替代 kprobe/kretprobe,可获得约 15% 的性能提升。
- [2]:CentOS 7.9、RedHat 7.6 向 3.10 内核中移植了一部分 eBPF 能力。
- 在这两个发行版中,DeepFlow 支持的详细内核版本如下(依赖的 Hook 点):
- 3.10.0-957.el7.x86_64
- 3.10.0-1062.el7.x86_64
- 3.10.0-1127.el7.x86_64
- 3.10.0-1160.el7.x86_64
- 注意 RedHat 的声明:
The eBPF in Red Hat Enterprise Linux 7.6 is provided as Tech Preview and thus doesn't come with full support and is not suitable for deployment in production. It is provided with the primary goal to gain wider exposure, and potentially move to full support in the future. eBPF in Red Hat Enterprise Linux 7.6 is enabled only for tracing purposes, which allows attaching eBPF programs to probes, tracepoints and perf events.
- [3]:容器内的 Golang/OpenSSL 进程不支持。
- [4]:在内核 4.14 中,一个 tracepoint 不能被多个 eBPF program attach(例如不能同时运行两个或多个 deepflow-agent)。其他版本不存在该问题。
- [5]:目前支持 SUSE 12 SP5 4.12.14,但 Linux 社区的 4.12 版本依然不支持。
- [6]:KylinOS V10 SP1 部分内核(例如 4.19.90-23.48.v2101.ky10.aarch64)可正常运行,但不确保 KylinOS V10 SP1 所有 aarch64 架构内核都能正常运行 deepflow-agent。
- [7]:KylinOS V10 SP2 某些内核(如 4.19.90-24.4.v2101.ky10.aarch64)由于不支持 bpf_probe_read_user(),无法读取用户态数据,因此不支持 AutoTracing;但支持持续剖析和文件读写追踪功能。
支持语言
类型支持语言/库社区版企业版on-cpuJava✔✔C/C++✔✔Rust✔✔Golang✔✔Python ***✔✔CUDA✔✔Lua *✔✔off-cpuJava✔C/C++✔Rust✔Golang✔Python ***✔CUDA✔Lua *✔on-gpuCUDA *✔mem-allocJava **✔Rust✔Golang *✔Python * ***✔mem-inuseRust✔hbm-allocCUDA *✔hbm-inuseCUDA *✔rdmaC/C++ *✔说明:
- *:开发中的功能(尚未正式发布)
- **:运行 Java 程序的 JVM 必须包含符号表,参考下文的 JVM 符号表检查
- ***:当前支持版本为 Python 3.10
- 语言分类:
- 编译为 ELF 格式可执行文件的语言:Golang、Rust、C/C++
- 使用 JVM 虚拟机的语言:Java
- 解释型语言:Python
获取 Profiling 数据需满足两个前提条件:
<ul>应用进程需要开启 Frame Pointer,或启用 Agent 的 DWARF 栈回溯能力<ul>
应用进程开启 Frame Pointer(帧指针寄存器):<ul>
编译 C/C++:gcc -fno-omit-frame-pointer
编译 Rust:RUSTFLAGS="-C force-frame-pointers=yes"
编译 Golang:默认开启,无需额外编译参数
运行 Java:-XX:+PreserveFramePointer
- 开启该参数会禁用某些编译器优化,不过根据 Netflix 和 Brendan Gregg 的实测结果,通常只会引入 deployment name 填写
函数类型对应关系
Function Type含义Profile Event Type特征O对象类型mem-*Memory Profile 的叶子节点H云主机*等于 Total 的根节点P进程*以 [p] 开头,且不等于 Total 的根节点T线程*以 [t] 开头K内核函数*以 [k] 开头CCUDA 驱动函数*以 [c] 开头L动态链接库函数*以 [l] 开头?未知函数*其他以 [ 开头A应用函数*除以上之外的函数通过 API 查询数据
参考 DeepFlow 官方文档中 API 的使用方式。
</ol>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |