专栏首页程序员财富自由之路Go tool 问题排查- 协程泄漏问题

Go tool 问题排查- 协程泄漏问题

内推美团:求一份 Java 简历,坐标:北京。关注后点击与我联系

下载测试代码

go get 中可以获取测试程序, 注意加上 -d 避免下载后自动安装。

Github

go get -d github.com/wolfogre/go-pprof-practice
cd $GOPATH/src/github.com/wolfogre/go-pprof-practice

如果 go get 下载不了, 可以 git clone 下载

gir clone https://github.com/wolfogre/go-pprof-practice

对代码进行编译

然后运行

go mod init
go mod tidy

最后再运行

go build
./go-pprof-practice

保持程序运行,打开浏览器访问 http://localhost:6060/debug/pprof/,可以看到如下页面:

在这里插入图片描述

内存泄漏问题排查

golang 和 Java 有点类似,自带了内存回收, 所以一般不会发生内存泄漏。但是也不绝对, golang 中 协程本身是可能泄漏的,或者叫做协程协程失控,进而导致内存泄漏。

启动程序

为了能更加图形化的展示,可以安装。graphviz

安装方式

brew install graphviz # for macos
apt install graphviz # for ubuntu
yum install graphviz # for centos

安装完成后,我们继续在上文的交互式终端里输入 web,注意,虽然这个命令的名字叫“web”,但它的实际行为是产生一个 .svg 文件,并调用你的系统里设置的默认打开 .svg 的程序打开它。如果你的系统里打开 .svg 的默认程序并不是浏览器(比如可能是你的代码编辑器),这时候你需要设置一下默认使用浏览器打开 .svg 文件

浏览器访问 http://localhost:6060/debug/pprof/

在这里插入图片描述

可以看到协程有 46 个, 使用 pprof 排查一下

go tool pprof http://localhost:6060/debug/pprof/goroutine

在这里插入图片描述

输入 top 命令

可以看到 cum 那一行 , 是 Drink 有40 个协程。

查看 list.Drink

在这里插入图片描述

输入 web, 浏览器可以看到 冒红的那部分。

可能这次问题藏得比较隐晦,但仔细观察还是不难发现,问题在于 github.com/wolfogre/go-pprof-practice/animal/canidae/wolf.(*Wolf).Drink 在不停地创建没有实际作用的协程:

func (w *Wolf) Drink() {
 log.Println(w.Name(), "drink")
 for i := 0; i < 10; i++ {
  go func() {
   time.Sleep(30 * time.Second)
  }()
 }
}

可以看到 Drink 函数 ,每次循环会有创建10个协程, 协程会 sleep 30s 才会退出,如果反复调用这个 Drink 函数, 那么会导致大量协程出现泄漏,协程数会增加。

内推美团:求一份 Java 简历,坐标:北京。关注后点击与我联系

欢迎关注公众号:程序员财富自由之路

公众号:程序员财富自由之路

博客:CSDN 王小明

关注我们,了解更多

关注后:回复 “idea” 或者 “内推”, 有惊喜

参考资料

  • https://blog.wolfogre.com/posts/go-ppof-practice/#%E6%8E%92%E6%9F%A5-cpu-%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98

本文分享自微信公众号 - 程序员财富自由之路(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一起 goroutine 泄漏问题的排查

    在 golang 中创建 goroutine 是一件很容易的事情,但是不合理的使用可能会导致大量 goroutine 无法结束,资源也无法被释放,随着时间推移造...

    用户6859632
  • 一起 goroutine 泄漏问题的排查

    ? 作者: yanhengwang,腾讯 PCG 开发工程师 在 golang 中创建 goroutine 是一件很容易的事情,但是不合理的使用可能会导致大量...

    腾讯技术工程官方号
  • 记一次内存泄漏的问题排查

    收到告警后,笔者先登录到告警机器中, top命令查看此时此刻的各个应用程序占用的内存大小, 这里其实有两个指标可以查看,

    2014v
  • 记一次内存泄漏的问题排查

    收到告警后,笔者先登录到告警机器中, top命令查看此时此刻的各个应用程序占用的内存大小, 这里其实有两个指标可以查看,

    2014v
  • 【实践】golang pprof 实战-CPU,heap,alloc,goroutine,mutex,block

    如果要说在 golang 开发过程进行性能调优,pprof 一定是一个大杀器般的工具。但在网上找到的教程都偏向简略,难寻真的能应用于实战的教程。这也无可厚非,毕...

    辉哥
  • K8S 问题排查:cgroup 内存泄露问题

    这篇文章的全称应该叫:[在某些内核版本上,cgroup 的 kmem account 特性有内存泄露问题],如果你遇到过 pod 的 cannot alloca...

    YP小站
  • 记一次golang内存泄漏问题的排查

    最近在用golang开发一个内容推荐的项目, 在打算进行压测前就发现容器每过一段时间就会重启,查看机器内存情况时发现自启动来内存一直在上升,然后到达一个容器最大...

    Johns
  • go pprof实战

    1 为什么要进行性能优化 1.1 哪些情况需要进行性能优化 其实关于性能优化的主题,网上已经讨论很多次,这里谈一下我的理解,那么其实核心就是2个点: 服务一直...

    QQ音乐技术团队
  • 如何排查句柄泄露问题

    人间四月天,bug无处钻,让bug没有藏身之地。今天,我们来聊句柄泄漏的定位。部分朋友遇到性能问题时,束手无策。别担心,我们一起实践,不信你搞不定。

    范蠡
  • Golang程序性能分析

    程序性能分析我相信是每个程序员都会遇到的问题,比如说一个程序的CPU为什么占用这么高?有没有优化的空间?又比如程序出现了内存泄漏如何排查等等。如果是C++程序会...

    用户2937493
  • 实战Go内存泄露

    最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第...

    大彬
  • 排查 Go 程序内存占用高问题

    可以看到这次出问题的地方在 github.com/wolfogre/go-pprof-practice/animal/muridae/mouse.(*Mouse...

    王小明_HIT
  • go:如何定位内存cpu问题

    此时,可以在web浏览器中输入http://localhost:6060/debug/pprof/,并点击进入 heap,查看信息。 重要的数据在下面:

    超级大猪
  • JVM 常见线上问题 → CPU 100%、内存泄露 问题排查

      后文会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前市面上还是有很多 Windows 服务...

    青石路
  • Go pprof 快速分析 CPU 高负载问题

    公司一个同事使用 Go Websocket 开发了 k8s 在线调试服务,该服务也部署在 k8s 集群中,没几天运维那边通告说 cpu 100% 高负载了,还把...

    梦醒人间
  • Go中http超时问题的排查

    最新有同事反馈,服务间有调用超时的现象,在业务高峰期发生的概率和次数比较高。从日志中调用关系来看,有2个调用链经常发生超时问题。

    蘑菇先生
  • Dockerd资源泄露系列 - 内存&FD泄露 - 1

    线上部分宿主机dockerd占用内存过大,有的甚至超过100G,而整个宿主上的容器使用的内存还不如dockerd一个进程使用的多,现在的处理办法是故障自愈,检测...

    我是阳明
  • golang定位内存泄露与cpu占用过高的方法与实战

    现在使用golang的项目越来越多,但是当golang发生内存泄露或cpu占用过高时,怎么定位呢?其实很简单,按如下所述步骤操作即可:

    shionyu
  • Valgrind 使用入门

    Valgrind 是一套类似于 gprof 的动态检测的工具集,由于使用方便,不需修改目标程序源码,输出清晰图文并茂等优势,常被用作后台(特别是linux后台)...

    王纯

扫码关注云+社区

领取腾讯云代金券