最近用golang开发了一个socket服务端,主要逻辑就是接收客户端发来的数据解析后存入opentsdb中,但是跑一段时间后发现内存就会增长,而且不会被gc回收,初步判定是由于大量make[]byte导致内存不释放,代码如下,求高人解惑?funcStartTCP()error{tcp_addr,_:=net.ResolveTCPAddr("tcp4",tcp_listen)listener,err:=net.ListenTCP("tcp4",tcp_addr)iferr!=nil{returnerr}deferlistener.Close()log.Info("starttcplistenon%s",tcp_listen)for{conn,err:=listener.AcceptTCP()iferr!=nil{log.Error("accepterror%s",err.Error())continue}log.Info("newsessioncreate%s",conn.RemoteAddr().String())goHandlerConn(conn)}}funcReadPacket(conn*net.TCPConn)[]byte{head:=make([]byte,4)_,err:=io.ReadFull(conn,head)iferr!=nil{returnnil}size:=binary.BigEndian.Uint32(head)data:=make([]byte,size)_,err=io.ReadFull(conn,data)iferr!=nil{returnnil}returndata}funcHandlerConn(conn*net.TCPConn){addr:=conn.RemoteAddr().String()deferfunc(){iferr:=conn.Close();err!=nil{log.Error("closesessionerror%s",err.Error())}else{log.Info("sessionclosed%s",addr)}}()for{data:=ReadPacket(conn)iflen(data)==0{log.Warn("emptydata")return}goHandlerMsg(conn,data,t)}}附pprof信息(pprof)top9.92GBof9.93GBtotal(100%)Dropped359nodes(cum
2 回答
www说
TA贡献1775条经验 获得超8个赞
后来opentsdb出过一次故障修复后就恢复正常了,内存使用维持在200M上下,pprofheap也稳定在2k左右,而且该现象也无法复现,只能判定是opentsdb的问题而导致内存不释放了。
添加回答
举报
0/150
提交
取消