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

mb6004f88aa04b6 · · 1879 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

在使用 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 相关官方文档。


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb6004f88aa04b6

查看原文:使用 pprof 进行 golang 程序内存分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1879 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传