定位gc问题所在
最后更新于:2022-04-02 04:56:47
这一点主要使用pprof来实现。开启pprof也特别简单,用net/http/pprof包可以快速实现。只需要在之前的代码中加下面三行就可以:
~~~
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
log.Println(http.ListenAndServe("localhost:8081", nil))
}
~~~
在程序启动之后,只需要在命令行或者浏览器输入以下命令即可:
~~~
go tool pprof http://127.0.0.1:8081/debug/pprof/heap //查看堆的使用,即内存使用情况
go tool pprof http://127.0.0.1:8081/debug/pprof/profile //查看cpu耗时,会详细列出每个函数的耗时
go tool pprof http://127.0.0.1:8081/debug/pprof/goroutine //当前在运行的goroutine情况以及总数
~~~
可以看下profile的输出信息, flat代表单个函数的运行时间,而cum则是累加的时间,也会包括这个函数下面的子函数的累加时间,所以main.main肯定是100%:
~~~
Showing nodes accounting for 1485.59kB, 100% of 1485.59kB total
Showing top 10 nodes out of 14
flat flat% sum% cum cum%
902.59kB 60.76% 60.76% 1485.59kB 100% compress/flate.NewWriter /usr/local/go/src/compress/flate/deflate.go
583.01kB 39.24% 100% 583.01kB 39.24% compress/flate.newDeflateFast /usr/local/go/src/compress/flate/deflatefast.go (inline)
0 0% 100% 583.01kB 39.24% compress/flate.(*compressor).init /usr/local/go/src/compress/flate/deflate.go
0 0% 100% 1485.59kB 100% compress/gzip.(*Writer).Write /usr/local/go/src/compress/gzip/gzip.go
0 0% 100% 1485.59kB 100% net/http.(*ServeMux).ServeHTTP /usr/local/go/src/net/http/server.go
0 0% 100% 1485.59kB 100% net/http.(*conn).serve /usr/local/go/src/net/http/server.go
0 0% 100% 1485.59kB 100% net/http.HandlerFunc.ServeHTTP /usr/local/go/src/net/http/server.go
0 0% 100% 1485.59kB 100% net/http.serverHandler.ServeHTTP /usr/local/go/src/net/http/server.go
0 0% 100% 1485.59kB 100% net/http/pprof.Index /usr/local/go/src/net/http/pprof/pprof.go
0 0% 100% 1485.59kB 100% net/http/pprof.handler.ServeHTTP /usr/local/go/src/net/http/pprof/pprof.go
~~~
如果想看具体的图示的话,可以使用png命令将结果存成图片看(png > "路径"),比如:
~~~
(pprof) png > /Users/liupengjie/Downloads/heap.png
Generating report in /Users/liupengjie/Downloads/heap.png
~~~
可以看到生成图片的样子, 有具体的箭头以及每个函数占用的时间或者内存。
';