pprof与Jaeger需组合使用才能准确定位瓶颈:pprof指出“哪段代码慢”,Jaeger指出“哪次调用慢、链路断在哪”;单独使用易误判。

直接看 pprof + Jaeger 组合,单靠其中任何一个都容易误判——pprof 告诉你“哪段代码慢”,Jaeger 告诉你“哪次调用慢、链路断在哪”,两者对齐才能准确定位瓶颈。
pprof 采集不到有效数据?先确认三件事
常见错误现象:跑完 go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30,火焰图一片平,或只看到 runtime.findrunnable 占比超高。
- 压测流量是否真实打到了目标服务?检查 access log 或用
netstat -an | grep :6060确认 pprof 端口有连接 - pprof 是否暴露在正确地址?Docker/WSL 下默认
localhost:6060不通,得改成http.ListenAndServe("0.0.0.0:6060", nil) - CPU profile 是否采满 30 秒?时间太短,
runtime.findrunnable这类调度热点根本显不出来;若无法稳定压测,改用/debug/pprof/heap?alloc_space或/goroutine?debug=2即时查
Jaeger 显示一堆孤立 root span?上下文根本没传下去
UI 里 TraceID 不一致、Span 没 Parent Span ID,不是 Jaeger 没收到数据,是 HTTP 请求链路断裂了。
- 入口 handler 必须用
tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))解析父 context - 下游 HTTP 请求前,必须用
tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))注入 - 别手动
r.Header.Set("X-Trace-ID", ...)——只传 ID 丢掉了采样决策和 Span 状态,http.Request.Context()才是唯一可信载体 - 启新 goroutine(如发 MQ、写日志)时,要显式
ctx = context.WithValue(parentCtx, key, val)传 span,否则它会新建 trace
pprof top10 出现这些函数名,立刻停手查
打开 go tool pprof cpu.prof 后执行 top10,以下函数名一出现就是明确信号:
立即学习“go语言免费学习笔记(深入)”;
-
runtime.findrunnable占比 > 15% → goroutine 数失控(比如每请求启 50 个未管控 goroutine) -
sync.runtime_SemacquireMutex或sync.RWMutex.Lock高频 → 全局 map/cache 加锁争用严重 -
runtime.mallocgc耗时突增 → GC 压力大,接着查/debug/pprof/heap?alloc_space看encoding/json.(*encodeState).marshal是否排前三 -
runtime.chansend占比超 30% → channel 成串行瓶颈,先查发送方是否在循环里无节制写入,再考虑改用select { case ch
heap profile 看不出泄漏?漏了强制 GC 和 delta 对比
常见错误:采了 /debug/pprof/heap 发现 json.Marshal 占比高,优化后 RSS 还是涨。
- 默认 heap profile 只反映
inuse_space(当前存活对象),泄漏藏在allocs或两次快照的净增长里 - 必须加
?gc=1强制 GC 后采样:curl -s "http://localhost:6060/debug/pprof/heap?gc=1" > heap1.pb.gz - 压测一段时间后再采一次:
curl -s "http://localhost:6060/debug/pprof/heap?gc=1" > heap2.pb.gz - 对比净增长:
go tool pprof -base heap1.pb.gz heap2.pb.gz,重点关注 delta 值大的函数
最常被忽略的一点:Jaeger 的采样率设置过高(如 1.0)会让存储暴涨、查询卡顿,过低(如 0.001)又可能漏掉偶发慢调用;生产环境建议用自适应采样(如基于 error 或 latency 动态提升采样率),而不是固定值。



















