在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, andtagignorecommands as other filtering options. For example, tagignore allows you to match anything but the given regex.
同时,注意pprofutil这个包