登录
首页 >  Golang >  Go问答

go语言服务端内存持续增长,求解惑!

来源:SegmentFault

时间:2023-01-16 14:00:07 207浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《go语言服务端内存持续增长,求解惑!》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go、Socket、socket服务端,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

最近用golang开发了一个socket服务端,主要逻辑就是接收客户端发来的数据解析后存入opentsdb中,但是跑一段时间后发现内存就会增长,而且不会被gc回收,初步判定是由于大量make []byte 导致内存不释放,代码如下,求高人解惑?

func StartTCP() error {
    tcp_addr, _ := net.ResolveTCPAddr("tcp4", tcp_listen)
    listener, err := net.ListenTCP("tcp4", tcp_addr)
    if err != nil {
        return err
    }
    defer listener.Close()
    log.Info("start tcp listen on %s", tcp_listen)
    for {
        conn, err := listener.AcceptTCP()
        if err != nil {
            log.Error("accept error %s", err.Error())
            continue
        }
        log.Info("new session create %s", conn.RemoteAddr().String())
        go HandlerConn(conn)
    }
}


func ReadPacket(conn *net.TCPConn) []byte {
    head := make([]byte, 4)
    _, err := io.ReadFull(conn, head)
    if err != nil {
        return nil
    }
    size := binary.BigEndian.Uint32(head)
    data := make([]byte, size)
    _, err = io.ReadFull(conn, data)
    if err != nil {
        return nil
    }
    return data
}


func HandlerConn(conn *net.TCPConn) {
    addr := conn.RemoteAddr().String()
    defer func() {
        if err := conn.Close(); err != nil {
            log.Error("close session error %s", err.Error())
        } else {
            log.Info("session closed %s", addr)
        }
    }()
    for{
        data := ReadPacket(conn)
        if len(data) == 0 {
            log.Warn("empty data")
            return
        }
        go HandlerMsg(conn, data, t)
    }
}

附pprof信息

(pprof) top
9.92GB of 9.93GB total (  100%)
Dropped 359 nodes (cum 

正确答案

后来opentsdb出过一次故障修复后就恢复正常了,内存使用维持在200M上下,pprof heap也稳定在2k左右,而且该现象也无法复现,只能判定是opentsdb的问题而导致内存不释放了。

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go语言服务端内存持续增长,求解惑!》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表