★ pprof 采样工具链怎么用?CPU/内存/goroutine 问题分别怎么排查?

一句话结论:pprof 是 Go 自带的性能剖析工具,采样而非全量记录:CPU 默认 100Hz(每 10ms 一次)记录调用栈,heap 按分配采样,goroutine 输出存活 goroutine 的栈;配合 go tool pprof 与 /debug/pprof 端点即可定位 CPU 热点、内存占用与 goroutine 泄漏。

怎么采集

  • 引入包:import _ "net/http/pprof",服务启动后访问 /debug/pprof/ 下的端点。
  • CPU:go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=30
  • 堆:访问 /debug/pprof/heap,或用 -alloc_space 查看累积分配。
  • goroutine:/debug/pprof/goroutine?debug=1 直接看文本全量栈。
  • 阻塞与锁:需先在代码中设置 runtime.SetBlockProfileRate 与 SetMutexProfileFraction。

怎么分析

问题现象建议采集常用命令
CPU 使用率高profiletop / top -cum / list 函数名
内存持续上涨两份 heap 快照go tool pprof -base=旧文件 新文件
单点分配过多heap -alloc_spacetop 看分配热点
goroutine 暴涨goroutine看栈顶卡在 channel/锁/IO 哪里
锁竞争严重mutex/blockgo tool pprof -mutex / -block

web 命令可生成火焰图与调用图(需要 graphviz);对 HTTP 接口压测的同时采 CPU,通常最能还原线上瓶颈。

一次典型排查

// 采集:压测期间执行
// go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=30

// 交互式终端里:top 找到热点函数,再 list hotFunc 看行号

内存泄漏的正确姿势是抓两个时间点各一份快照,用 -base 对比增量;只看一份 inuse_space,容易把正常的缓存或对象池误判成泄漏。

常见追问 / 记忆点

  • 追问:goroutine 暴涨一定是泄漏吗?——先看栈顶卡点:卡在 channel 收发、锁、IO 且无人唤醒才是泄漏信号。
  • 追问:为什么用采样而不是全量统计?——全量记录开销太大;采样以极小代价近似全局画像。
  • 记忆点:CPU 用 top+list,堆用双快照 -base 对比,goroutine 看栈顶卡点;压测时采样才贴近真实。
笔记加载中…