go 慢请求火焰图

149 阅读1分钟

持续性能分析平台往往只能获取应用的 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)

通过获取堆栈展开,绘制火焰图:

截屏2024-06-21 下午1.52.54.png

在 graph 中可以找到每个调用栈对应的 goroutine label。

截屏2024-06-21 下午1.53.43.png

如果把 traceid 作为 goroutine label,在goroutine label 中添加时间戳等标记,我们就可以采集慢请求的火焰图。

需要建立在经过我们优化过后的零开销 goroutine 采样之上