Go net/http/pprof分析内存泄露及解决过程

 更新时间:2025年04月15日 09:07:25   作者:rgc_520_zyl  
这篇文章主要介绍了Go net/http/pprof分析内存泄露及解决过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

内存泄露出现的原因

在go语言中,其自身实现了 GC(垃圾回收)机制, 所有出现内存泄露的原因很大可能是 有些goroutine因为各种各样的原因(如 channel阻塞或未设置close channel的功能)导致 垃圾回收机制 认为这些goroutine还在正常运行,无法被回收(每个goroutine至少占用2KB资源),长时间处理大量请求后,导致内存耗尽。

业务大致场景

go语言编写的kong插件中,出现内存泄露。

分析方法

嵌入如下代码; 即使是在 go脚本中,通过如下代码,也会生成一个pprof的http服务,供web端分析使用。

import "github.com/Kong/go-pdk/server"
import _ "net/http/pprof"


// main 主入口函数,启动go-pdk中的server
func main() {
	// 服务资源分析时使用
	go func() {
		err := http.ListenAndServe("0.0.0.0:6000", nil)
		if err != nil {
			panic("启动服务失败")
		}
	}()

	err := server.StartServer(New, Version, Priority)
	if err != nil {
		panic(err)
	}
}

运行服务,并 查看 http://localhost:6000/debug/pprof/goroutine?debug=1 分析方式如下:

压测请求此服务; 对比发现 协程个数不断增加的地方;从而找到内存泄露点;

具体原因

最终发现 是 链路追踪的jaeger reporter(导出span数据到jaeger中)每次请求进入都新建一个协程,导致内存泄露

解决方法

通过 全局变量+ sync.Once 保证 只生成一个 jaeger reporter;从而 不会生成多个协程,及 节约 网络io资源。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • go sync Once实现原理示例解析

    go sync Once实现原理示例解析

    这篇文章主要为大家介绍了go sync Once实现原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go设计模式之代理模式讲解和代码示例

    Go设计模式之代理模式讲解和代码示例

    这篇文章主要介绍了Go代理模式,代理是一种结构型设计模式, 让你能提供真实服务对象的替代品给客户端使用,本文将对Go代理模式进行讲解以及代码示例,需要的朋友可以参考下
    2023-07-07
  • Go从defer关键字到锁用法实例demo

    Go从defer关键字到锁用法实例demo

    在Go语言中,defer语句用于延迟执行一个函数或方法,直到包含它的函数执行完毕时才执行,这篇文章主要介绍了Go从defer关键字到锁用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-06-06
  • 4个场景教会你Go中Goroutine和通道是怎么用的

    4个场景教会你Go中Goroutine和通道是怎么用的

    本篇给出了4个在运维开发工作中较为常见的且也是比较典型的场景,通过这些场景来带大家掌握Go中Goroutine和通道是怎么使用的,需要的可以学习一下
    2023-05-05
  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结

    如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下
    2022-08-08
  • 使用Go语言实现并发处理CSV文件到数据库

    使用Go语言实现并发处理CSV文件到数据库

    Go 语言的 goroutine 和通道(channel)非常适合用来并发地处理数据,本文将通过简单示例介绍一下如何使用Go语言并发地处理 CSV 文件并将数据插入到数据库中,感兴趣的可以了解下
    2025-01-01
  • Linux操作系统上打包Go项目实现方式

    Linux操作系统上打包Go项目实现方式

    文章介绍了Go项目依赖打包的两种方法:GoModules(管理依赖并确保一致性)和静态链接(嵌入依赖生成独立可执行文件),需注意cgo配置及系统兼容性,推荐根据需求选择合适方式
    2025-08-08
  • 一文带你了解Golang中select的实现原理

    一文带你了解Golang中select的实现原理

    select是go提供的一种跟并发相关的语法,非常有用。本文将介绍 Go 语言中的 select 的实现原理,包括 select 的结构和常见问题、编译期间的多种优化以及运行时的执行过程
    2023-02-02
  • golang实践-第三方包为私有库的配置方案

    golang实践-第三方包为私有库的配置方案

    这篇文章主要介绍了golang实践-第三方包为私有库的配置方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 创建Go工程化项目布局详解

    创建Go工程化项目布局详解

    这篇文章主要介绍了创建Go工程化项目布局详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论