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 从运行中的应用获取性能数据:
-
获取 CPU Profile
例如,获取 30 秒的 CPU 分析数据:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 -
获取 Heap Profile
获取内存堆分析数据:
go tool pprof http://localhost:6060/debug/pprof/heap -
获取 Goroutine Profile
获取当前所有 goroutine 的堆栈跟踪:
go tool pprof http://localhost:6060/debug/pprof/goroutine -
获取 Block Profile
获取阻塞操作的分析数据:
go tool pprof http://localhost:6060/debug/pprof/block -
获取 Mutex Profile
获取互斥锁的分析数据:
go tool pprof http://localhost:6060/debug/pprof/mutex
2. 使用 perf 工具进行系统级分析
如果你的 Go 应用未启用 pprof,可以使用 perf 工具进行系统级分析。perf 是 Linux 平台上强大的性能分析工具,适用于对应用进行采样和分析。
-
确保
perf工具已安装:sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r) -
运行你的 Go 应用,例如:
./myapp -
使用
perf工具对正在运行的应用进行采样:perf record -F 99 -p $(pgrep myapp) -g -- sleep 30 -
分析生成的性能数据:
perf report
3. 使用 bpftrace 进行 eBPF 分析
eBPF 是一种强大的内核技术,能够在不修改代码的情况下进行性能分析。
-
安装
bpftrace:sudo apt-get install bpftrace -
编写一个简单的
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]); } -
运行
bpftrace脚本:sudo bpftrace trace_go.bpf
4. 使用 strace 进行系统调用跟踪
strace 是一个诊断、调试和教学工具,可以监控应用程序与操作系统内核之间的交互,包括系统调用和信号。
-
使用
strace跟踪应用:strace -p $(pgrep myapp) -c这将统计每种系统调用的次数和时间,并生成报告。
-
使用
strace跟踪并输出详细日志:strace -p $(pgrep myapp) -o strace_output.txt这将把详细的系统调用日志输出到
strace_output.txt文件中。
通过上述方法,可以在不修改代码的情况下,对运行中的 Go 应用进行耗时分析和性能排查。这些工具和技术可以帮助你快速定位和解决性能瓶颈。