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

go内置内存分析工具pprof go 内存占用情况分析 阅读详情

引言

日常项目,有时会出现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 "github.com/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 和 
gopprof 性能分析 go pprofGo 语言提供的性能分析工具。它可以帮助开发者分析 Go 程序的性能问题,包括 CPU 使用情况、内存分配情况、阻塞情况等。 阅读详情

相关推荐

详解Go语言的内存模型及堆的分配管理

前言 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。从非常宏观的角度看,Go内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 Go这门语言抛弃了C/C++中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软...

陌上轩客 1001

Golang内存分析工具gctrace和pprof实战

gctrace用途主要是用于跟踪GC的不同阶段的耗时与GC前后的内存量对比。使用的时候仅需在启动的时候添加GODEBUG='gctrace=1'的命令参数即可。如下。

FeelTouch Labs 2017

golang 使用pprofgo-torch做性能分析

软件开发过程中,项目上线并不是终点。上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写。 golang工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能方便了不少。加上uber的火焰图,可视化显示,让我们在分析程序时更简单明了。pprof有两个包用来分析程序一个是net/http/pprof另一个是runtime/pprof,net/http/pprof只是对runtime/pprof包进行封装并用http暴露出来,如下图源码所示: 使用net/..

dz45693的专栏 1465

Golang 性能分析工具 PProf

profile.proto是一个ProtocolBufferv3的描述文件,它描述了一组callstack和symbolization信息,作用是表示统计分析的一组采样的调用栈,是很常见的stacktrace配置文件格式。pprof以profile.proto读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取各个函数占用的CPU等资源占用信息。,查看导致互斥锁的竞争持有者的堆栈跟踪。

weixin_45961386的博客 1772

golang 性能分析(pprof)

性能分析 从业务目标角度,通常我们的瓶颈出现在业务的通量和时延两个问题上 比如一个MySQL数据库,你从其他机器上对它发请求,每秒它能处理10万个请求,这个就是通量性能;每个请求的反应时间是0.5ms,这个就是时延性能 通量和时延是相互相承的两个量,当通量达到系统上限,时延就会大幅提高 一般而言,性能分析主要关注 CPU、内存、磁盘 IO、网络这些指标 runtime/pprof 适用...

firefly 5614

Go 程序调试总结

pprof有两个包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来 实例 package main import ( "log" "net" "net/http" "time" ) func run() { http.ListenAndSer...

cyq6239075的博客 2464

go test run 文件_Go 调试分析的高阶技巧

大纲Golang toolsnmcompileobjdumppproftrace单元测试执行单元测试统计代码覆盖率程序 Debugdlv 调试用法gdb 调试小技巧不知道怎么断点函数?不知道调用上下文?不知道怎么开启 pprof ?为什么有时候单点调试的时候,总是非预期的执行代码?总结golang 高阶调试本文专注 golang debug 的一些技巧应用,以及相关工具的实用用法,再也不...

weixin_39952074的博客 1740

Go最新常用调试golang的bug以及性能问题的实践方法_go有性能问题的代码,腾讯T2大牛手把手教你

● ……

2401_84904942的博客 1182

linux pprof工具安装,Golang性能分析工具PProf使用/Go GC监控

Golang提供了强大的代码性能分析工具PProf,能够非常方便的监控代码运行性能。性能分析可以采用命令行方式 go tool pprof 同时也提供直观的http可视化方式,非常方便。数据采集性能分析基础数据的获取有三种方式:1> runtime/pprof 包2> net/http/pprof 包3> go test 时添加收集参数runtime/pprof 包的使用[不推荐...

weixin_39643244的博客 1053

调试内存命令_Go 调试分析的高阶技巧

大纲Golang toolsnmcompileobjdumppproftrace单元测试执行单元测试统计代码覆盖率程序 Debugdlv 调试用法gdb 调试小技巧不知道怎么断点函数?不知道调用上下文?不知道怎么开启 pprof ?为什么有时候单点调试的时候,总是非预期的执行代码?总结golang 高阶调试本文专注 golang debug 的一些技巧应用,以及相关工具的实用用法,再也不...

weixin_36094492的博客 1062

使用 pprof 和 Flame-Graph 调试 Golang 应用

前言 最近用 Golang 实现了一个日志搜集上报程序(内部称logger项目),线上灰度测试过程发现logger占用 CPU 非常高(80% - 100%)。而此项目之前就在线上使用,用于消费NSQ任务, CPU 占用一直在 1%,最近的修改只是添加了基于磁盘队列的生产者消费者服务,生产者使用 go-gin 实现了一个 httpserver,接收数据后写入磁盘队列;消费者...

weixin_30322405的博客 206

Golang pprof 分析程序使用内存和执行时间

也是可以通过 top 和 list 某个函数步骤去查看具体信息。-alloc_space:查看分配空间相关的信息。-inuse_space:查看当前内存使用情况。

潘广宇的博客 2632

使用多年的 go pprof 检查内存泄漏的方法居然是错的?!

最近在做一个 Redis 的 Proxy 的项目,其中利用 Redis 6.0 新加的 tracking 功能实现客户端缓存的功能,可以为某些特定的 redis 使用场景提高吞吐和延迟...

Go中国 1897

golang pprof工具

pprof整理pprof整理pprof是什么pprof使用net/http/pprof使用模拟并发情况分析 pprof整理 pprof是什么 pprof分析和显示性能相关数据的工具 pprof读取profile.proto格式的分析抽样集合数据,同时创建报告来展现和帮助分析数据,它能创建包括文本和图型报告。 profile.proto 是一个描述调用者和符号信息集合的protocol buffer。一个通常的使用是用来从统计分析数据中表现抽样调用栈集合。 profile 可以被读取从一个本地文件,或者通

jfcat的专栏 583

常用调试golang的bug以及性能问题的实践方法

所以我们要是想得到cpu性能,就是要获取到当前进程的profile文件,这个文件默认是30s生成一个,所以你的程序要至少运行30s以上(这个参数也可以修改,稍后我们介绍)这里面能够通过pprof查看包括(阻塞信息、cpu信息、内存堆信息、锁信息、goroutine信息等等), 我们这里关心的cpu的性能的profile信息.2、如果此时在top指令查询内存的时候,如果依然是800+MB,说明垃圾回收器回收了应用层的内存后,(可能)并不会立即将内存归还给系统。您可以在秒GET参数中指定持续时间。

qq_51537858的博客 762
上一篇: 乐观锁,悲观锁与Golang
月守护
博客等级 码龄7年 210粉丝 160原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值