引言
日常项目,有时会出现oom的情况,这时候我们光依靠code review进行问题定位是很困难的。这里我们需要一个排查工具,来定位是哪里的代码导致内存溢出的,这个工具就是pprof
前提
如果是非http(s)服务类的,需要在代码中嵌入如下几行代码
import _ "net/http/pprof"
go func() {
http.ListenAndServe("0.0.0.0:8899", nil)
}()
如果是http(s)类的的服务,可以添加上所使用的pprof第三方库,如gin
import "/gin-contrib/pprof"
//StartHttp 新建HTTP服务
func StartHttp() error {
router := gin.New()
...
pprof.Register(router)
addr := fmt.Sprintf(":%d", 8899)
if err := router.Run(addr); err != nil {
return err
}
return nil
}
使用
在浏览器中输入http://ip:8899/debug/pprof/可以看到一个汇总页面
其中heap项是我们需要关注的信息,可以点进去看下,但信息比较分散,没啥大用
更有用的信息我们需要借助go tool pprof来进行分析
go tool pprof -alloc_space/-inuse_space http://ip:8899/debug/pprof/heap
# 注意 -alloc_space