前言
在使用 golang 编写复杂的项目时,往往会有用到多协程并发的场景,这时候容易因为疏忽,产生协程泄漏的问题,进而产生类似于内存泄漏的后果。 本文主要针对协程泄漏问题的排查,提供 golang 程序内存可视化分析的思路和做法。
pprof 简介
pprof 是用于可视化和分析配置文件数据的工具。
pprof 读取 profile.proto 格式的概要分析样本的集合,并生成报告以可视化并帮助分析数据。它可以生成文本和图形报告(通过使用 dot 可视化包)。
pprof 使用方法
埋点
首先,我们需要在 golang 程序内埋点,引入 pprof 的监测代码,并通过 http 接口暴露出来。
import _ "net/http/pprof"func main() { go func() { _ = http.ListenAndServe("0.0.0.0:8081", nil) }()// your code}复制代码
然后我们启动需要分析的程序,就可以准备分析它了。
如何查看各个模块申请内存的大小
通过分析各个模块和函数占用的内存的大小,可以极为有效地排查内存泄漏。
命令行方式生成可视化分析图像
go tool pprof -alloc_space -cum http://localhost:8081/debug/pprof/heap复制代码
命令运行后,在控制台输入 web ,按下回车,会用.svg 默认的查看软件打开一个 svg 图片,展示了各个模块的内存占用图。
如果输入 web 运行后报错 Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%,是因为电脑没有安装 Graphviz,这是图像生成依赖的组件。
解决方法是:打开 graphviz.gitlab.io/download/ 按照提示下载安装即可。安装完成后,对于 Windows,要在设置环境变量 path 后面加上 Graphviz 安装路径的 bin 文件夹。
web 方式浏览器查看具体数据列表
http://localhost:8081/debug/pprof/heap?debug=1复制代码
如何查看各个模块创建的协程数量
通过分析各个模块和函数创建的协程的数量,可以极为有效地排查协程泄漏,如果存在协程泄漏,对应的模块的协程数量是惊人的。
命令行方式生成可视化分析图像
go tool pprof http://localhost:8081/debug/pprof/goroutine复制代码
命令运行后,在控制台输入 web ,按下回车。
web 方式浏览器查看具体数据列表
http://localhost:8081/debug/pprof/goroutine?debug=1复制代码
总结
以上就是 pprof 的简单使用方法的介绍,相信对排查 golang 的内存泄漏和协程泄漏问题会有所帮助。如果需要更多更详细的用法,请参考 pprof 相关官方文档。
有疑问加站长微信联系(非本文作者)