ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

开发那些事儿:EasyNTS上云网关平台内存泄露是什么原因?如何解决?

2022-08-26 16:34:53  阅读:157  来源: 互联网

标签:EasyNTS defer 网关 函数 上云 循环 内存


EasyNTS上云网关包含组网运维、多协议视频流拉转推等功能,它可以解决内网设备上云、内网业务上云、直播上云、运维上云等上云需求,通过端口穿透技术,可以将内网的任何网络设备,以IP+端口的形式发布到云端,让处于内网的设备成为一个“云设备”,帮助企业打造“虚拟云主机”。

 

 

有用户反馈,EasyNTS运行pprof一段时间后,内存持续增长。运行30个小时后,从启动时的1.2%飙升到33%,并在2周时间左右系统因内存而崩溃。我们对此情况立刻进行了排查与分析。

1)查看pprof,发现了几个占用内存较大的函数。

 

 

StatisticalFlow函数是用于统计流量输入输出的,每30秒执行一次,其中嵌套了多级for循环。每个循环里面还嵌套了网络请求及defer Body.CLose() 。

defer表示函数结束后执行,for循环表示函数永远不会结束,这就导致每30秒都有一定量的defer压入函数栈帧中,无限增大,无法释放。当函数栈不够用时,又去申请更大的内存空间,将旧的数据拷贝过去,并且一直重复这个过程。

从代码结构上来看也极其糟糕,在for循环里面嵌套了多个for循环,层级就有4级,如下图所示:

 

 

再看另外一个函数,记录设备下线日志,此处每个客户端会创建至少一个协程,并在for循环里每15秒创建一个无法回收的定时器。

 

 

在加载配置中,右侧调用可以看到有非常多的调用,每次调用都要重新加载配置。因为返回的是指针,会逃逸到堆上,直到垃圾回收才清理。

 

 

以上分析结果均是导致用户EasyNTS内存泄露的原因。根据以上分析,可通过以下办法解决内存问题:

1)删除defer,在资源使用完毕后立即关闭;

2)定时器创建在for循环外面;

3)重构函数,每个函数尽量不要超过60行;

4)配置相关使用单例模式。

EasyNTS上云网关可应用在多种场景中,如远程办公、在线课堂、虚拟直播等,当然也可以进行各种上云服务,如果大家还想了解更多相关内容,欢迎持续关注我们的更新,也欢迎大家联系我们探讨更多内容。

标签:EasyNTS,defer,网关,函数,上云,循环,内存
来源: https://www.cnblogs.com/TSINGSEE/p/16627939.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有