Skip to content
gqlxj1987's Blog
Go back

go 1.9 Profiler labels

Edit page

Profiler labels in Go

在Go 1.9中,加入了Profiler labels部分。

CPU profilers collect and output hot spots where the CPU spent most time in when executing

A typical CPU profiler output is primarily reports the location of these spots as function name, source file/line, etc

在以往的Go的调试过程中,性能问题的debug往往是最困难的。

With 1.9, Go is introducing a new feature that allows you to record additional information to provide more context about the execution path.

The runtime/pprof package will export several new APIs to let users add labels

关于打label部分:

labels := pprof.Labels("worker", "purge")
pprof.Do(ctx, labels, func(ctx context.Context) {
    // Do some work...

    go update(ctx) // propagates labels in ctx.
})

采用net/http/pprof来分析相关的性能,

package main

import _ "net/http/pprof"

func main() {
    // All the other code...
    log.Fatal(http.ListenAndServe("localhost:5555", nil))
}

通过

$ go tool pprof http://localhost:5555/debug/pprof/profile

首先通过tags区分出相关的path部分

(pprof) tags
http-path: Total 80
        70 (87.50%): /messages
        10 (12.50%): /user

worker: Total 158
       158 (  100%): purge

通过相关的filter部分,我们可以仅关注到/user部分

(pprof) tagfocus="http-path:/user"
(pprof) top10 -cum
Showing nodes accounting for 0.10s, 3.05% of 3.28s total
      flat  flat%   sum%        cum   cum%
         0     0%     0%      0.10s  3.05%  main.generateID.func1 /Users/jbd/src/hello/main.go
     0.01s   0.3%   0.3%      0.08s  2.44%  runtime.concatstring2 /Users/jbd/go/src/runtime/string.go
     0.06s  1.83%  2.13%      0.07s  2.13%  runtime.concatstrings /Users/jbd/go/src/runtime/string.go
     0.01s   0.3%  2.44%      0.02s  0.61%  runtime.mallocgc /Users/jbd/go/src/runtime/malloc.go
         0     0%  2.44%      0.02s  0.61%  runtime.slicebytetostring /Users/jbd/go/src/runtime/string.go
         0     0%  2.44%      0.02s  0.61%  strconv.FormatInt /Users/jbd/go/src/strconv/itoa.go
         0     0%  2.44%      0.02s  0.61%  strconv.Itoa /Users/jbd/go/src/strconv/itoa.go
         0     0%  2.44%      0.02s  0.61%  strconv.formatBits /Users/jbd/go/src/strconv/itoa.go
     0.01s   0.3%  2.74%      0.01s   0.3%  runtime.memmove /Users/jbd/go/src/runtime/memmove_amd64.s
     0.01s   0.3%  3.05%      0.01s   0.3%  runtime.nextFreeFast /Users/jbd/go/src/runtime/malloc.go

当然还有其他的命令

You can also use tagshow, taghide, and tagignore commands as other filtering options. For example, tagignore allows you to match anything but the given regex.

同时,注意pprofutil这个包


Edit page
Share this post on:

Previous Post
Authentication and Authorization in MicroService
Next Post
半年总结