pprof实战-内存泄漏

go这么好用的pprof包却引发了安全漏洞?规避pprof自动注册默认url 线上的产品 由于go pprof产生了漏洞,如何规避,这里的三个方法一定可以帮助你 阅读详情

场景

在一台服务器中运行了多个服务,在运行一段时间后(不足一天),发现某个进程占用了50%以上的内存资源,导致服务器异常

解决方案

首先在代码中开启pprof性能分析

runtime.SetBlockProfileRate(1)
	go func() {
		log.Println(http.ListenAndServe(":9080", nil))
	}()

采用在web界面查看的方式,此处监听9080端口
打开浏览器访问web页面:http://ip:1080/debug/pprof/访问

/debug/pprof/

Types of profiles available:
Count	Profile
4320	allocs
265	    block
0	    cmdline
110	    goroutine
4320	heap
0	    mutex
0	    profile
48	    threadcreate
0	    trace
full    goroutine stack dump
Profile Descriptions:

allocs: A sampling of all past memory allocations
block: Stack traces that led to blocking on synchronization primitives
cmdline: The command line invocation of the current program
goroutine: Stack traces of all current goroutines
heap: A sampling of memory allocations of live objects. You can specify the gc GET parameter to run GC before taking the heap sample.
mutex: Stack traces of holders of contended mutexes
profile: CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.
threadcreate: Stack traces that led to the creation of new OS threads
trace: A trace of execution of the current program. You can specify the duration in the seconds GET parameter. After you get the trace file, use the go tool trace command to investigate the trace.

讲到内存泄漏,第一反应是去查看heap,实际上在查看时

heap profile: 718: 76326576 [829493: 1114177328] @ heap/1048576
1: 75759616 [1: 75759616] @ 0x40f2f9 0x410dc9 0x4143aa 0x685cee 0x686045 0x6ad612 0x6ad345 0xab8dca 0xab8da3 0x9cf4fc 0x99a1e9 0x9cf6bb 0x667b4c 0x99bd85 0x9b9eb3 0x7dbf03 0x7d742d 0x471801
#	0x685ced	github.com/gogf/gf/container/gmap.(*StrAnyMap).doSetWithLockCheck+0x14d	C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/container/gmap/gmap_hash_str_any_map.go:220
#	0x686044	github.com/gogf/gf/container/gmap.(*StrAnyMap).GetOrSetFuncLock+0xa4	C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/container/gmap/gmap_hash_str_any_map.go:254
#	0x6ad611	github.com/gogf/gf/os/gmlock.(*Locker).getOrNewMutex+0x51		C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/os/gmlock/gmlock_locker.go:130
#	0x6ad344	github.com/gogf/gf/os/gmlock.(*Locker).Lock+0x44			C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/os/gmlock/gmlock_locker.go:33
#	0xab8dc9	github.com/gogf/gf/os/gmlock.Lock+0x3e9					C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/os/gmlock/gmlock.go:19
#	0xab8da2	avrtc/app/system/admin/internal/api.(*wssApi).Init.func1+0x3c2		C:/Users/DELL/Desktop/signal/app/system/admin/internal/api/websocket.go:200
#	0x9cf4fb	github.com/gogf/gf/net/ghttp.(*middleware).Next.func1.8+0x3b		C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/net/ghttp/ghttp_request_middleware.go:111
#	0x99a1e8	github.com/gogf/gf/net/ghttp.niceCallFunc+0x48				C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/net/ghttp/ghttp_func.go:46
#	0x9cf6ba	github.com/gogf/gf/net/ghttp.(*middleware).Next.func1+0x13a		C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/net/ghttp/ghttp_request_middleware.go:110
#	0x667b4b	github.com/gogf/gf/util/gutil.TryCatch+0x6b				C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/util/gutil/gutil.go:46
#	0x99bd84	github.com/gogf/gf/net/ghttp.(*middleware).Next+0x164			C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/net/ghttp/ghttp_request_middleware.go:47
#	0x9b9eb2	github.com/gogf/gf/net/ghttp.(*Server).ServeHTTP+0x652			C:/Users/DELL/go/pkg/mod/github.com/gogf/gf@v1.15.4/net/ghttp/ghttp_server_handler.go:122
#	0x7dbf02	net/http.serverHandler.ServeHTTP+0xa2					C:/Program Files/Go/src/net/http/server.go:2887
#	0x7d742c	net/http.(*conn).serve+0x8cc						C:/Program Files/Go/src/net/http/server.go:1952

可以发现几乎都是框架以及系统级别的,对内存泄漏定位的意义不大,这里借用大佬的观点来阐述一下pprof对于heap的一些观点:

  • 内存profiling记录的是堆内存分配的情况,以及调用栈信息,并不是进程完整的内存情况,猜测这也是在go pprof中称为heap而不是memory的原因。
  • 栈内存的分配是在调用栈结束后会被释放的内存,所以并不在内存profile中。
  • 内存profiling是基于抽样的,默认是每1000次堆内存分配,执行1次profile记录。
  • 因为内存profiling是基于抽样和它跟踪的是已分配的内存,而不是使用中的内存,(比如有些内存已经分配,看似使用,但实际以及不使用的内存,比如内存泄露的那部分),所以不能使用内存profiling衡量程序总体的内存使用情况。

且在实际场景中,更多的是由于goroutine管理不当造成的内存泄漏,此时我们查看goroutine里的内容

goroutine profile: total 13647
11274 @ 0x43abc5 0x4068cf 0x40650b 0xab87b5 0x471801
#	0xab87b4	avrtc/app/system/admin/internal/api.notifyFxn+0x54	C:/Users/DELL/Desktop/signal/app/system/admin/internal/api/websocket.go:156

对这里的数据进行一个说明,开头的total是协程的总阻塞数,而在每一项的开头的数字,则代表了该项的协程阻塞数,可以清楚的看到

websocket.go:156,即该文件的156行就开启了11274个协程,即使我们只将一个协程按照2kb进行计算,这也是一个不容忽视的数字

解决结果

定位到行数,那么就好办了

func notifyFxn(ws *ghttp.WebSocket, c chan string, lock string, done *bool) {
	for ;*done == false; {
		notify := <-c
		glog.Line().Debugf("Notify %s\n", notify)
		gmlock.Lock(lock)
		ws.WriteMessage(2, []byte(notify))
		gmlock.Unlock(lock)
	}
}

看到156行正是由于notify := <-c通道引起的阻塞,至此,定位结束

这是pprof的一个小的实战案例,后续有实际场景再进行补充

Go内存泄漏排查实战:pprof与trace定位OOM问题 在Go服务中,即使有垃圾回收(GC)机制,内存占用持续上涨直至OOM的场景依然常见,这通常源于引用未释放、goroutine永久阻塞或全局结构无界增长。理解GC的工作原理和内存分配形态,是定位问题的基础。pprof作为标准性能分析工具,通过heap与goroutine profile可快速锁定内存占用和goroutine堆积的代码位置;而runtime/trace则从时间线视角揭示goroutine生命周期与调度阻塞的因果关系。两者配合使用,能有效区分真正泄漏、无界增长与分配过高,并精准定位到具体函数与代码 阅读详情

相关推荐

Go pprof 性能调优实战:从线上告警到内存泄漏排查

性能分析是软件开发中定位瓶颈、优化资源利用率的关键技术,其核心原理是通过采样或全量记录程序运行时的调用栈与资源消耗,将模糊的“感觉慢”转化为可量化的数据依据。在 Go 生态中,pprof 作为运行时内置的剖析工具,支持 CPU、内存、协程、锁竞争等多维度采样,帮助开发者精准定位热点函数、内存泄漏及调度延迟。掌握 pprof 的采集策略与火焰图解读,不仅能提升线上问题排查效率,更是构建高并发服务性能基线的工程实践基础。

weixin_42523670的博客 295

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

大概意思是开发者并没有发现pprof会泄漏啥信息,issue提出者使用的是gosec工具做的静态安全扫描,可能产生很多编译期间的误报,然后社区达成一致的结论是和prometheus社区保持一致,转而使用codeql工具。如果实在要解决就按照本文章进行

Meepoljd的博客 2万+

Golang pprof实战:从线上内存泄漏到精准性能调优

本文通过一次真实的线上内存泄漏排查实战,详细介绍了如何使用Golang内置的pprof工具进行性能分析与调优。文章从告警响应、数据抓取、报告解读到根因分析,系统性地展示了如何利用pprof定位内存泄漏、CPU瓶颈及协程泄漏等常见问题,并提供了将pprof集成到开发监控体系的最佳实践。

weixin_29278805的博客 111

使用pprof分析golang内存泄露问题

pprof解决线上golang程序内存泄露问题

陈旭猿的博客 2357

Go服务性能排查实战:pprof从CPU热点到内存泄漏

性能调优的第一步不是猜,而是拿到可量化的证据。在 Go 服务中,pprof 是官方提供的采样分析工具,通过基于系统信号的 CPU 采样和堆内存快照,把程序运行时的热点与内存占用转化为可读的调用栈和火焰图。CPU profile 用于定位时间消耗在哪个函数链路上,heap profile 则区分存量与分配量,分别对应内存泄漏和 GC 压力。无论是接口服务的线上排查,还是压测后的性能基线归档,pprof 都能用数据替代猜测。结合 -base 差分对比多个时间点的 profile,可以快速锁定内存只涨不降的根因。

weixin_33326218的博客 286

【Go 实战剖析】pprof 火焰图与内存泄漏的精准定位

本文深入剖析了如何使用Go语言的pprof工具生成火焰图来精准定位内存泄漏问题。通过实战案例演示了火焰图的生成、解读方法,并详细介绍了goroutine泄漏、缓存失控等典型场景的排查技巧,帮助开发者高效解决内存问题。

weixin_42648844的博客 144

Go语言内存泄漏排查与pprof工具实战指南

内存管理是编程语言的核心机制之一,Go语言通过垃圾回收(GC)实现自动内存管理,但仍可能因goroutine泄漏、资源未释放等原因出现内存泄漏问题。pprof作为Go官方性能分析工具,能够通过heap和goroutine采样帮助开发者定位内存泄漏源。在实际工程中,结合trace工具分析GC行为和goroutine生命周期,可以有效解决JSON解析、全局缓存等典型场景的内存泄漏。本文以线上服务内存泄漏排查为例,详细演示了如何使用pprof的top、list等命令分析heap profile,以及如何通过对比不

weixin_29306875的博客 278

使用pprof快速定位Go程序中的内存泄漏

内存泄漏是一个常见的问题,特别是在长时间运行的生产环境Go程序中。内存泄漏会导致程序占用的内存越来越多,最终可能导致系统崩溃或性能下降。为了快速定位和解决内存泄漏问题,Go语言提供了一个强大的性能分析工具,称为pprof。pprof是Go语言内置的性能分析工具之一,可以帮助开发者查找和定位程序中的性能问题,包括内存泄漏。本文将介绍如何使用pprof工具来快速定位和解决Go程序中的内存泄漏问题。

IELLQUI8的博客 1335

TypeScript Go内存泄漏终极指南:pprof全流程检测与实战优化

TypeScript Go作为TypeScript的原生移植版本,在提升性能的同时也面临着内存管理的挑战。本文将带你掌握使用pprof工具进行内存泄漏检测的完整流程,从环境配置到问题定位,助你轻松解决TypeScript Go应用中的内存问题。 ## 为什么选择pprof进行内存检测? 在TypeScript Go开发中,内存泄漏可能导致应用性能下降、响应延迟甚至崩溃。pprof作为Go语言生

gitblog_00672的博客 673

【漏洞复现】Kubernetes PPROF内存泄漏漏洞(CVE-2019-11248)

Kubernetes(简称K8S)是Google在2014年开源的一个容器集群管理系统。它用于容器化应用程序的部署、扩展和管理,目标是让部署容器化应用简单且高效。

晚风不及你 9333

hMailServer安装配置

hMailServer安装配置 使用宝塔面板上的宝塔邮件服务器2.1版本,进行安装hMailServer。 宝塔在安装hMailServer是有做了一些配置,如果是手工安装需要注意一下配置点: 1、\hMailServer\Bin 目录下增加mysql连接文件libmysql.dll,要去下载32位的。 libmysql.dll下载 链接:https://pan.baidu.com/s/1YGJXzjowlJ9n_MiqB4xiqw 提取码:wz90 2、 需要提前安装mysql,并创建hM.

王者的博客 5866

Go 实战Go内存泄漏,pprof定位内存泄漏问题

引言: 最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露问题。 关于Go的内存泄露有这么一句话不知道你听过没有: 10次内存泄露,有9次是goroutine泄露。 我所解决的问题,也是goroutine泄露导致的内存泄露,所以这篇文章主要介绍Go程序的goroutine泄露,掌握了如何定位和解决goroutine泄露,...

Mark66890620 8132

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

Go 用 pprof 定位性能瓶颈:CPU 火焰图与内存泄漏排查实战

服务上线后 CPU 莫名飙高,或者内存一路涨到 OOM,靠加日志、猜代码往往找不到根因。Go 自带的pprof才是正解——它能告诉你 CPU 时间花在哪个函数、内存被谁一直占着不放。这篇不讲原理堆砌,直接带你把 pprof 接进服务、抓下数据、看懂火焰图、定位一个真实的内存泄漏。

weixin_42662753的博客 139

SpeedyBee F405 V3 50A飞塔装机全攻略:从开箱到首飞避坑指南

本文提供SpeedyBee F405 V3 50A飞塔的详细装机指南,涵盖从开箱检查、硬件焊接、软件配置到安全首飞的全流程。重点剖析了电源连接、固件刷写等高频故障点,帮助FPV新手避开常见陷阱,确保一次成功组装并安全起飞。

weixin_29179311的博客 416

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4476

Higress网关内存泄漏排查:pprof实战指南

还在为Higress网关内存泄漏问题头疼?网关运行时间一长,内存占用持续飙升,最终导致服务崩溃?本文手把手教你使用pprof工具快速定位和解决Higress网关内存泄漏问题,让你彻底告别内存烦恼! 读完本文你将收获: - ✅ pprof基本使用方法和原理 - ✅ Higress内存泄漏常见场景分析 - ✅ 实战案例:内存泄漏排查全流程 - ✅ 性能优化建议和最佳实践 ## 什么是pprof

gitblog_00980的博客 725

图数据挖掘 ECC K-core core number truss number clique

K-core:什么叫k-core,给定一个正整数k(k>=0),k-core是一个G的最大子图(也就是说k-core是一个图的限制),将这个子图定义为Hk,对于Hk中的每个顶点v,他的度数都是大于等于k的。 k-core是内嵌的,如下图所示,集合{ABCD}是H3,也就是3-core的子图。而集合{ABCDE}是H2,也就是2-core的子图,集合{ABCDEGF}是H1,也就是1-core的子图,而从集合的角度来讲H3<H2<H1。 core number:什么叫kcor

weixin_45193103的博客 1685

pprof实战:我是如何定位内存泄漏问题的

pprof是Go性能分析的利器。掌握基本的pprof命令理解不同采样类型的用途结合火焰图定位问题定期采集profile进行分析性能分析是一个持续的过程,需要定期进行。

好代码自己会说话,烂代码才需要注释来圆谎 9676

人体红外传感器HC-SR501

本文记录的是如何用stm32使用HC-SR501。实验平台:野火指南者stm32f103vet6。实验现象:一旦有人体经过,LED会亮红色。HC-SR501 传感器工作原理人体都有恒定的体温,一般在 37 度,所以会发出特定波长 10UM 左右的红外线,被动式红外探头就是靠探测人体发射的 10um 左右的红外,进行工作的。人体发射的 10um 左右。

weixin_43772611的博客 1万+

基于matlab的CNN验证码识别系统(UI界面版)

基于matlab的CNN验证码识别系统(UI界面版),CNN验证码识别系统包括数据集处理、模型搭建、模型训练、界面设计与实现

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 481

Go pprof性能调优实战:从接口超时到内存泄漏的排查指南

性能分析是后端开发中定位接口响应慢、内存泄漏和协程阻塞等问题的核心技术。其原理是通过采样程序运行时的CPU使用、内存分配和协程栈等数据,生成火焰图和调用图,将性能瓶颈从猜测变为可量化定位。在工程实践中,合理使用pprof能显著提升服务稳定性和资源利用率,广泛应用于HTTP服务、微服务架构及高并发场景。Go语言通过net/http/pprof标准库提供了极低侵入的接入方式,结合火焰图阅读和采样频率控制,可高效排查map性能、GC压力和协程泄漏等典型问题。

weixin_33226548的博客 242

三维点云转深度图

点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。

点云兔子的博客 3171

go-zero内存泄漏排查:pprof工具的实战应用

在高并发服务中,内存泄漏(Memory Leak)是最隐蔽且危害巨大的问题之一。它会导致服务占用内存持续增长,最终触发OOM(Out Of Memory)错误并崩溃。go-zero作为高性能微服务框架,内置了完整的性能分析工具链,帮助开发者快速定位和解决内存泄漏问题。 ## go-zero中的pprof集成方案 go-zero通过`core/proc/profile.go`实现了对pprof工...

gitblog_00976的博客 492

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Go内存泄漏排查:pprof与trace工具实战指南

内存泄漏是软件开发中的常见问题,尤其在并发编程场景下更为复杂。Go语言虽然具备垃圾回收机制,但goroutine泄漏、全局缓存失控等问题仍会导致内存异常增长。通过runtime/pprof工具可以分析堆内存分配情况,定位内存热点;而runtime/trace则能追踪goroutine生命周期和系统事件,两者结合可精准诊断泄漏源。本文以全局cache和goroutine泄漏为典型案例,演示如何利用heap profile识别内存占用对象,结合trace分析goroutine阻塞链,最终给出缓存限流和conte

weixin_26934905的博客 217

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go pprof性能分析实战:从CPU飙高到内存泄漏的排查指南

性能分析是后端开发中定位系统瓶颈的核心能力,其基本原理是通过采样程序运行时的CPU使用、内存分配和协程状态等数据,还原出函数级别的资源消耗画像。在Go语言中,pprof作为标准库自带的性能分析工具,能够帮助开发者快速定位CPU飙高、内存泄漏、goroutine泄漏以及锁竞争等典型问题。掌握pprof的采集与解读方法,不仅能显著缩短线上故障的排查时间,还能在预发阶段建立性能基线,提前发现代码退化。无论是高并发服务中的接口超时,还是GC频繁导致的周期性卡顿,pprof都能提供精确到代码行的诊断依据。

weixin_33428613的博客 190

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 使用Go Modules引入本地包
下一篇: Go删除切片元素的另一种姿势
StaticAuto
博客等级 码龄7年 7粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值