我使用 Golang 写的一个融合日志服务, 定时融合不同云厂商的日志, 该服务部署在 K8S 上.
在国庆期间日志量倍增, 该服务频繁被 Killed.
通过仪表盘, 发现该服务运行一次后, 内存不会释放, 怀疑是内存泄露导致的. 见下图.

最终, 我通过使用 pprof 解决了该问题.
1. 开启 pprof 服务
pprof 是 Golang 自带的性能分析工具. 可以 2 步 开启 pprof 服务.
2. 通过 pprof 的 Web 页面分析 goroutine
[]()
如图:

full goroutine stack dump

goroutine

我在 Web 页面上并未发现有价值的信息, 于是使用命令行分析.
3. 通过 pprof 的命令行分析 heap
go tool pprof -inuse_space []()
这个命令的作用是, 抓取当前程序已使用的 heap. 抓取后, 就可以进行类似于 gdb 的交互操作.
time.NewTimer

list <函数名>list time.NewTimerNewTimerruntimeTimer

for ... select ... time.After
原来程序中存在如下代码:
time.AfterNewTimertime.After
NewTimer