当前位置: 首页 > news >正文

Golang协程泄漏定位和排查

Golang协程泄漏定位和排查

  • 1 场景:无缓冲channel写阻塞
  • 2 排查和定位思路
    • 2.1 Golang pprof
    • 2.2 协程数监控
    • 2.3 操作系统内存泄漏
  • 参考

1 场景:无缓冲channel写阻塞

package mainimport ("log""net/http"_ "net/http/pprof""time""github.com/gin-gonic/gin"
)func main() {go func() {log.Println(http.ListenAndServe("localhost:6060", nil))}()// 你的程序逻辑...g := gin.Default()g.GET("/hello", func(ctx *gin.Context) {ch := make(chan bool)go func() {time.Sleep(2 * time.Second)ch <- true}()select {case <-ch:breakcase <-time.After(time.Second):break}ctx.JSON(200, map[string]interface{}{"success": true,})})g.Run("127.0.0.1:8080")}

2 排查和定位思路

2.1 Golang pprof

在这里插入图片描述

在这里插入图片描述
stack和数量check匹配
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3942d93e1efa4827a5a1794d0a5a1923.png

2.2 协程数监控

在Golang中,可以使用runtime包的函数来监控和获取Goroutines的相关信息,如:

runtime.NumGoroutine():获取当前系统中的Goroutines数量
runtime.Gosched():主动让出CPU,让其他Goroutine运行
runtime.GOMAXPROCS():设置同时运行的最大CPU数量

2.3 操作系统内存泄漏

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
ePBF


# -a 表示显示每个内存分配请求的大小以及地址
# -p 指定案例应用的PID号
$ docker cp app:/app /app
$ /usr/share/bcc/tools/memleak -p $(pidof app) -a
Attaching to pid 12512, Ctrl+C to quit.
[03:00:41] Top 10 stacks with outstanding allocations:addr = 7f8f70863220 size = 8192addr = 7f8f70861210 size = 8192addr = 7f8f7085b1e0 size = 8192addr = 7f8f7085f200 size = 8192addr = 7f8f7085d1f0 size = 819240960 bytes in 5 allocations from stackfibonacci+0x1f [app]child+0x4f [app]start_thread+0xdb [libpthread-2.27.so] 

参考

1 Go 项目中的 Goroutine 泄露及其防范措施
2 案例篇:内存泄漏了,我该如何定位和处理?
3 golang并发编程实践之goroutines的监控与调试技巧
4 go pprof 性能分析
5 Golang 内存泄漏详解:原因、检测与修复

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 项目小总结
  • 在CentOS上搭建NFS服务器
  • rtmp推流
  • yolov8多任务模型-目标检测+车道线检测+可行驶区域检测-yolo多检测头代码+教程
  • 硬件工程师笔试面试——变压器
  • OpenAl o1论文:Let’s Verify Step by Step 快速解读
  • 模版进阶(template)
  • MySQL行转列
  • 聊聊Netty对于内存方面的优化
  • 使用 Sahi 实现 Web 自动化测试
  • HeterGCL-Graph Contrastive Learning Framework on Heterophilic Graph
  • 魅族20机型 M2381“工程固件”作用分析以及写入步骤
  • 机器学习,深度学习,AGI,AI的概念和区别
  • Mycat搭建分库分表
  • PyRFC 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定
  • [笔记] php常见简单功能及函数
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • css布局,左右固定中间自适应实现
  • JavaScript学习总结——原型
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • LintCode 31. partitionArray 数组划分
  • ReactNative开发常用的三方模块
  • vue.js框架原理浅析
  • vue-router 实现分析
  • Web设计流程优化:网页效果图设计新思路
  • 笨办法学C 练习34:动态数组
  • 实现菜单下拉伸展折叠效果demo
  • 我与Jetbrains的这些年
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些关于Rust在2019年的思考
  • 用jquery写贪吃蛇
  • MyCAT水平分库
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.each()与$(selector).each()
  • $GOPATH/go.mod exists but should not goland
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (c语言)strcpy函数用法
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (一)Java算法:二分查找
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net 调用php,php 调用.net com组件 --
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .py文件应该怎样打开?
  • ::
  • @RequestBody与@RequestParam
  • [2544]最短路 (两种算法)(HDU)
  • [Android]竖直滑动选择器WheelView的实现
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)