定位golang内存泄露

数据小菜鸟 · · 2965 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

内存问题一直是服务器一个老大难,最近线上有遇到一个棘手的内存泄露。记录分享一下 希望可以起到抛砖引玉的效果。同时给方便自己好记性不如烂笔头。

使用 gin web框架
所以使用了 github.com/DeanThompson/ginpprof
用法 跟 pprof 一样 只是 复用ginweb端口

go tool pprof -inuse_space http://***.com/debug/pprof/heap

pprof.png

我这个懒捣鼓半天,最好想看下堆栈


看内存堆栈1.png

查看堆栈2.png
坑爹代码.png

结果是gorm 事务 begin了,在特定条件下 没有 Commit 或者 Rollback 。导致内存泄露。socket 句柄泄露。

#使用指令 查看句柄
lsof
查看句柄.png
#统计句柄数量
lsof |grep TCP|wc -l
统计句柄数.png
#进程句柄
ll /proc/pid/fd
#统计进程句柄数
ll /proc/pid/fd|wc -l
根据进程号查句柄.png

变量使用范围特别重要,因为分支会导致结果不一样。加大定位难度。
想c++(cppcheck) java(findbugs) 有代码分析工具可以分出这个bug避免用写轮眼找bug(我的眼快瞎了都是血丝)。go 的话 golint 和 gometalinter。不过 不知道 是我有点傻不拉几。一直分析出来的结果跟我要的有差役(持续学习ing)。goland集成的是可以分析到函数未使用更深级别的分析还找到有这样牛逼的软件。如果有找到 可以分享给我,一起交流成长。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:数据小菜鸟

查看原文:定位golang内存泄露

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2965 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传