golang连接kafka(sarama)内存暴涨问题记录
问题背景
有同事反馈使用gin封装的框架, 使用kafka客户端类库(sarama)步发布消息, qps为100+, 上线后内存,cpu爆炸。
排查过程
- 首先排查代码层面写的有逻辑bug, 比如连接未close, 排查无问题
- 排查发布的消息较大, 导致golang频繁gc, 和同事确认,无频繁gc
- 通过查看源码,发现每次http请求,操作kafka都是短链接, 即频繁的会新建短链接, 排查到这里,还是不能特别确认是因为短链接导致, 因为之前接入rabbitmq类库,也是使用的短链接。
- 使用
pprof
打印出火焰图, profile, 和block的, 也没发现特别大的bug点。 - 使用
sarama meory
搜索官方issue, 和谷歌查询。 得到出具体结论
分析具体问题
从官方issue 得知, sarama类库自动依赖第三方的统计类库go-mertic, 主要是为了方便给prometheus
统计数据。 sarama类库默认打开。导致该统计站的内存,迟迟未释放
因此使用sarama前, 将该统计关闭即可。
对应代码:
1 |
|
问题回顾
发生此次问题,主要有以下原因
- sarama建议使用长连接
- pprof查看内存火焰图,需查看heap.
本次新收获的pprof使用方式
1 |
|
参考文章:
- https://github.com/Shopify/sarama/issues/1358
- https://github.com/Shopify/sarama/issues/1321
- http://lday.me/2017/09/02/0012_a_memory_leak_detection_procedure/
- https://zhuanlan.zhihu.com/p/37405836