go耗时排查:pprof、perf、bpftrace、strace

573 阅读2分钟

1. 使用 pprof 工具分析运行中的 Go 应用

pprof 工具可以通过 HTTP 接口连接到运行中的 Go 应用,进行实时性能分析。这种方法需要应用已经启用了 net/http/pprof。如果应用已经启用了 net/http/pprof,可以直接使用 go tool pprof 进行分析。

检查应用是否启用了 pprof

首先,确认应用是否已经启用了 pprof。你可以尝试访问以下 URL 来检查:

http://localhost:6060/debug/pprof/

如果能够访问并看到 pprof 的调试页面,说明应用启用了 pprof

获取性能分析数据

使用 go tool pprof 从运行中的应用获取性能数据:

  1. 获取 CPU Profile

    例如,获取 30 秒的 CPU 分析数据:

    go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
    
  2. 获取 Heap Profile

    获取内存堆分析数据:

    go tool pprof http://localhost:6060/debug/pprof/heap
    
  3. 获取 Goroutine Profile

    获取当前所有 goroutine 的堆栈跟踪:

    go tool pprof http://localhost:6060/debug/pprof/goroutine
    
  4. 获取 Block Profile

    获取阻塞操作的分析数据:

    go tool pprof http://localhost:6060/debug/pprof/block
    
  5. 获取 Mutex Profile

    获取互斥锁的分析数据:

    go tool pprof http://localhost:6060/debug/pprof/mutex
    

2. 使用 perf 工具进行系统级分析

如果你的 Go 应用未启用 pprof,可以使用 perf 工具进行系统级分析。perf 是 Linux 平台上强大的性能分析工具,适用于对应用进行采样和分析。

  1. 确保 perf 工具已安装:

    sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
    
  2. 运行你的 Go 应用,例如:

    ./myapp
    
  3. 使用 perf 工具对正在运行的应用进行采样:

    perf record -F 99 -p $(pgrep myapp) -g -- sleep 30
    
  4. 分析生成的性能数据:

    perf report
    

3. 使用 bpftrace 进行 eBPF 分析

eBPF 是一种强大的内核技术,能够在不修改代码的情况下进行性能分析。

  1. 安装 bpftrace

    sudo apt-get install bpftrace
    
  2. 编写一个简单的 bpftrace 脚本,例如 trace_go.bpf

    tracepoint:sched:sched_process_exec /comm == "myapp"/ {
        printf("Process %s executed\n", comm);
    }
    
    tracepoint:syscalls:sys_enter_read /comm == "myapp"/ {
        @start[tid] = nsecs;
    }
    
    tracepoint:syscalls:sys_exit_read /comm == "myapp" && @start[tid] / {
        $delta = nsecs - @start[tid];
        printf("Read syscall took %d ns\n", $delta);
        delete(@start[tid]);
    }
    
  3. 运行 bpftrace 脚本:

    sudo bpftrace trace_go.bpf
    

4. 使用 strace 进行系统调用跟踪

strace 是一个诊断、调试和教学工具,可以监控应用程序与操作系统内核之间的交互,包括系统调用和信号。

  1. 使用 strace 跟踪应用:

    strace -p $(pgrep myapp) -c
    

    这将统计每种系统调用的次数和时间,并生成报告。

  2. 使用 strace 跟踪并输出详细日志:

    strace -p $(pgrep myapp) -o strace_output.txt
    

    这将把详细的系统调用日志输出到 strace_output.txt 文件中。

通过上述方法,可以在不修改代码的情况下,对运行中的 Go 应用进行耗时分析和性能排查。这些工具和技术可以帮助你快速定位和解决性能瓶颈。