1.背景
工作中,无意中发现vm系统日志里近期出现过OOM,且系统主动kill了某一进程(称为进程A)。 重新部署A的二进制文件,执行top命令观察到进程A疯狂吃内存,内存占比肉眼可见的飙升。 查看代码逻辑,大致为:for循环启动多个goroutine,每个goroutine各自从prometheus或者es库里查询指定index的内容,然后push到远程tsdb中,每间隔一段时间进入下一次循环。
2.现象查询
- 引入pprof工具分析内存泄露原因
_ import "net/http/pprof"
//在main函数里添加监听内容,端口视占用情况改动
go http.ListenAndServe(":8099", nil)
- 本地重新执行代码,访问http://127.0.0.1:8099/debug/pprof, 代码执行不到半分钟,50w+的groutine数量,而且一直在增加。
- 准备点击进去查看具体groutine内容时,mac已经卡到“不能自已”,只能关闭进程,不过为查询内存泄露指明了大致方向。