持续性能分析平台往往只能获取应用的 cpu,memory 等性能数据,通常用于保存现场。
现在通过持续性能分析平台,我们可以分析慢请求时间耗费在哪里,并关联请求 id 和 堆栈。
code:
启动 三个 goroutine:
func main() {
// goroutine 0
go func(i int) {
pprof.Do(context.Background(), pprof.Labels("key", strconv.Itoa(i)), func(ctx context.Context) {
select {
case <-time.After(10 * time.Second):
}
})
}(0)
go func(i int) {
pprof.Do(context.Background(), pprof.Labels("key", strconv.Itoa(i)), func(ctx context.Context) {
deepcall(10)
})
}(1)
go func(i int) {
pprof.Do(context.Background(), pprof.Labels("key", strconv.Itoa(i)), func(ctx context.Context) {
l, _ := net.Listen("tcp", "127.0.0.1:0")
l.Accept()
})
}(1)
通过获取堆栈展开,绘制火焰图:
在 graph 中可以找到每个调用栈对应的 goroutine label。
如果把 traceid 作为 goroutine label,在goroutine label 中添加时间戳等标记,我们就可以采集慢请求的火焰图。
需要建立在经过我们优化过后的零开销 goroutine 采样之上。