使用go pprof进行golang程序内存分析

时间:2024-10-11 07:28:59

引言

日常项目,有时会出现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