当前位置: 首页 > 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 内存泄漏详解:原因、检测与修复

http://www.lryc.cn/news/438294.html

相关文章:

  • 【我的 PWN 学习手札】Unlink Attack
  • 算法笔试-编程练习-好题-04
  • 使用Rustup快速无缝升级Rust
  • pytorch qwen2-vl自定义数据全量微调
  • 切换淘宝最新npm镜像源是
  • 全国历年高考真题2008-2024
  • 【vue-media-upload】一个好用的上传图片的组件,注意事项
  • linux第一课(操作系统核心)
  • 【期末复习】软件项目管理
  • C# List定义和常用方法
  • 如何在实际应用中更好地利用字典功能提高开发效率?
  • Windows 环境下 vscode 配置 C/C++ 环境
  • [通信原理]绪论2:信息量 × 信息熵
  • TCP套接字【网络】
  • 【devops】devops-git之github使用
  • GPT对话知识库——串口通信的数据的组成?起始位是高电平还是低电平?如何用代码在 FreeRTOS 中实现串口通信吗?如何处理串口通信中的数据帧校验吗?
  • 从头开始学MyBatis—02基于xml和注解分别实现的增删改查
  • AI音乐创作的新时代:从创意到旋律的智能化转型
  • Spring Boot集成Akka remoting快速入门Demo
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • 文件格式转换:EXCEL和CSV文件格式互相转换
  • 基于协同过滤的北京森林公园推荐---附源码74454
  • 002 JavaClent操作RabbitMQ
  • lablelme标注的数据转成YOLO v8 格式
  • 【linux】cat 命令
  • 速通sass基础语法
  • Vue: watch5种监听情况
  • Android 车联网——汽车系统介绍(附2)
  • C++ 链表
  • 中国初创公司数量下降了98%