美文网首页我爱编程
golang http请求之内存泄露

golang http请求之内存泄露

作者: getsu | 来源:发表于2018-05-28 18:02 被阅读0次

开发了个cas服务,实际使用上发现内存蹭蹭蹭的网上张,最后甚至超过了1G。于是引入pprof进行调查。
由于服务使用gin框架,这里有个插件github.com/gin-contrib/pprof,代码里如下使用:

    r := gin.Default()
    if gin.Mode() == gin.DebugMode {
        pprof.Register(r, "/cas/debug")
    }

启动服务,浏览器中打开http://localhost:8080/cas/debug/,能看见pprof信息了。
接下来通过Insomnia请求,发现goroutine每次请求+3个且不会释放。ok,先确定问题在goroutine这里了。

对代码进行肉眼检查,使用到goroutine的代码就一处,注释掉goroutine还是只加不减,这里看来问题不在这里。反复请求几次后,下载goroutine,heap和trace,运行go tool pprof XXX检查,没有代码相关的的名字,算是毫无头绪。于是用最笨的方法进行排查,一片一片的注释,测试,还好go服务启动快。

没用多久,就锁定到了一处http请求这里。我发现一调用ioutil.ReadAll,goroutine就上去了。于是乎,换其他的写法,io.Copy甚至response.Body.Read,统统无效。想想看ioutil.ReadAll是官方例子标准写法,不至于出内存泄露问题,那么问题就在其他不标准的写法。

仔细查这个http请求,由于内网环境ssl证书问题,这里没有使用DefaultClient,使用了

tr := &http.Transport{
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}

于是尝试着使用http端口,去掉Transport,使用回DefaultClient,问题解决。后来换上有效的ssl证书,也没有问题了。

官方文档介绍:

Clients and Transports are safe for concurrent use by multiple goroutines and for efficiency should only be created once and re-used.

估计是ssl证书无效,另一方面,由于自定义http client的时候,省略了太多的timeout参数,导致goroutine无法释放。

自定义Transport时需要注意内存问题。
https://github.com/golang/go/blob/master/src/net/http/transport.go

相关文章

  • golang http请求之内存泄露

    开发了个cas服务,实际使用上发现内存蹭蹭蹭的网上张,最后甚至超过了1G。于是引入pprof进行调查。由于服务使用...

  • Golang Http请求

    请求的结构 HTTP的交互以请求和响应的应答模式。go的请求我们早就见过了,handler函数的第二个参数http...

  • golang http请求

    1. http1请求 参考文章: <> Go Http包解析:为什么需要response.Bo...

  • Android 内存泄露

    我的博客:http://xuyushi.github.io原文地址 [TOC] 内存泄露 内存泄露的定义:当某些对...

  • 定位golang内存泄露

    内存问题一直是服务器一个老大难,最近线上有遇到一个棘手的内存泄露。记录分享一下 希望可以起到抛砖引玉的效果。同时给...

  • 内存分析工具使用-----实践篇

    先制造一个内存泄露。内存泄漏的几个方式 经典存泄露代码 http://blog.csdn.net/qq_17250...

  • go-http-url-request

    介绍golang关于http请求和url之间的用法:\ http-server http参数解析

  • Golang发送HTTP、HTTPS请求(包含Token和证书的

    Golang发送HTTP、HTTPS请求高能预警正文 最简单的 HTTP 请求 —— Get 方法使用场景代码解释...

  • golang http

    golang http http 挂载方法 Head 发送 HEAD 请求func Head(url string...

  • golang分层测试之http接口测试入门

    前言 本节主要讲使用golang进行接口测试,其中主要以http协议的接口测试来讲 golang中的http请求 ...

网友评论

    本文标题:golang http请求之内存泄露

    本文链接:https://www.haomeiwen.com/subject/dsagjftx.html