记一次golang内存泄露

application-manager
/debug/pprof/allocs
# go tool pprof http://127.0.0.1/debug/pprof/allocs
Fetching profile over HTTP from http://oms.qa.internal.hsmob.com/debug/pprof/allocs
Saved profile in C:\Users\liuch\pprof\pprof.application-manager.alloc_objects.alloc_space.inuse_objects.inuse_space.005.pb.gz
File: application-manager
Type: alloc_space
Time: May 24, 2021 at 9:21am (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web
setK8sEventgoLookupIpCNAMEOrder

进入该容器(application-manager),查看底层链接情况,可以看到在该容器中建立了9492条TCP链接。至此已经找到问题根因,内存泄露的原因是没有及时关闭TCP,导致创建了大量socket,占用大量内存。

# ss -s
Total: 10215 (kernel 15097)
TCP:   9492 (estab 7953, closed 1537, orphaned 0, synrecv 0, timewait 1106/0), ports 0

Transport Total     IP        IPv6
*         15097     -         -
RAW       0         0         0
UDP       0         0         0
TCP       7955      7952      3
INET      7955      7952      3
FRAG      0         0         0
ss -ntpelasticsearchsetK8sEventresp.Body.Close()

后记

resp.Body.Close()

总结

  • 如果golang程序发现内存泄露,可以首先检查socket泄露。