AutoProfiling

创建时间:2024-06-01 最近修改时间:2024-06-24

#1. AutoProfiling

通过 eBPF 获取应用程序的函数调用栈快照,DeepFlow 可绘制任意进程的 CPU Profiling,帮助开发者快速定位函数性能瓶颈。函数调用栈中除了包含业务函数以外,还可展现动态链接库、语言运行时、内核函数的耗时情况。除此之外,DeepFlow 在采集函数调用栈时生成了唯一标识,可用于与调用日志相关联,实现分布式追踪和函数性能剖析的联动。

DeepFlow 中的 CPU Profiling 和 Network Profiling

DeepFlow 中的 CPU Profiling 和 Network Profiling

#2. 能力和限制

支持的 Profiling 数据类型:

  • On-CPU
  • Off-CPU 仅企业版

支持的进程语言:

  • 编译为 ELF 格式可执行文件的语言:Golang、Rust、C/C++
  • 使用 JVM 虚拟机的语言:Java

获取 Profiling 数据需满足两个前提条件:

  • 进程需要开启 Frame Pointer(帧指针寄存器)
    • 编译 C/C++:gcc -fno-omit-frame-pointer
    • 编译 Rust:RUSTFLAGS="-C force-frame-pointers=yes"
    • 编译 Golang:默认开启,无需额外编译参数
    • 运行 Java:-XX:+PreserveFramePointer
  • 对于编译型语言的进程,编译时需要注意保留符号表

Off-CPU Profiling 功能仅会采集如下调用栈:

  • 让出 CPU 时进程状态等于TASK_INTERRUPTIBLE(可中断睡眠)或TASK_UNINTERRUPTIBLE(不可中断睡眠)的调用栈
  • 0 号进程(Idle 进程)以外的调用栈
  • 含有至少一个用户态函数的调用栈
  • 等待 CPU 的时间不超过 1 小时的调用栈