php current 内存泄漏,golang-pprof-排查内存泄漏(一)

golang 内存泄漏的排查记录一

一、发现问题

首先通过监控工具查看到某个项目的机器内存在部署之后总是不断上涨,但是用户量并不多,很明显是内存泄漏的问题。

d68483227a95f39f54b788097caf4fd6.png

监控

二、如何解决

项目中引入了以下代码,自然可以通过 pprof 工具进行分析。

package main

import (

"net/http"

_"net/http/pprof"

)

func init() {

go func() {

http.ListenAndServe(":8000",nil)

}()

}

三、解决步骤

解决问题尝试了很多种方案,最后方案如下:

1、通过 pprof 工具获取内存相差较大的两个时间点 heap 数据。

curl localhost:8000/debug/pprof/heap > heap.base

等待一段时间,通过 htop 可以查看到内存又涨了很多,然后再采集内存情况

curl localhost:8000/debug/pprof/heap > heap.current

2、通过 go tool pprof 工具比较两个内存的情况,找到是什么对象多创建了

go tool pprof -http=:8080 -base heap.base heap.current

选择当前分配的对象(insue_objects):

781e492dbc67c257f44ec6a46eedf36d.png

option

得到如图所示:

0057e33228e544ff059af89cd5a12cbf.png

pprof-heap-base

图中可以看出 withdraw_record.GetByUserId.FindAndCount() 在这段时间创建了 624110 个对象,于是怀疑是这里出了问题,于是去查看代码:

count, err = statement.Where("user_id = ? ", userId).FindAndCount(&records)

发现 statement 这个数据库 session 没有关闭,怀疑是因为没有关闭造成的问题

3、测试服问题复现

既然怀疑是这里的问题,然后就写了个 for 循环,不断地请求嫌疑接口,通过htop 发现,内存果然蹭蹭蹭网上涨,问题复现成功

4、将嫌疑代码修复了

修复就很简单了,加了一个 defer statement.Close()

5、部署修复后的代码到测试服务器验证

代码修复后,部署到测试服上,再用 for 循环去测,发现内存不再上涨,到此应该算是问题解决

6、查找项目中有没有类似代码并加以改正

四、注意点

1、不要在同一台机器一边跑项目,一边压测,否则两个程序都跑不满。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值