性能分析——node内存泄露

工具:devtool

安装条件:需要在node.js环境下

安装(注意一定需要全局安装):npm install -g devtool

运行:devtool app.js


    最近再研发浦航的生产可视化系统时,快要交付时,部署到客户服务器上后,发现客户服务器上的内存一点一点的增长,看规律是一天增长一两百兆,有时一个星期就挂了,有时后两周都没挂,但是内存有2G多。可是启动的时候才几十兆。

   因为是每隔5分钟会采一次modbus的数据,由于一次轮询只能采一百个寄存器,所以每采一次都要分好几次。全部采完后将数据保存到数据库,并且将缓存中的数据替换成最新采的。总以为是这里的问题,这块捣鼓了好久,加快采集的频率,给node拍的照上也没有发现采的数据暴增的问题,找不到规律,在最终苦恼着。

    后来比较后才发现多了很多数据库的信息,如下图所示:

内存拍照发现数据库信息

    mssql数据库的调用都是前端发过来的请求,所以猜测可能是mssql的问题。于是我关掉数据采集,加快前端动态刷新的频率,并监测内存变化。两个小时,内存从77兆涨到600多兆,如下图所示:

node内存占用

mssql这块处理的最简单,就百多行代码,看看发现从ConnectPool中创建的connection从来内有close过。

close后拍照:

close拍照

    前端页面的刷新的频率跟上面一样,并且加快了modbus的数据采集频率,开启客户端,一个小时后,关掉客户端,内存情况如下:


一个小时后

不关闭客户端内存也在130兆多一点。

    原来connection不close会带来如此巨大的内存泄露。这也验证了为何刚开始测试那周时客户那边的内存就爆了,是因为演示前一周各个部门都需要连这个系统进行测试。很多客户端都连着。这两个星期只有一个客户端连着,这样的连接创建的有限,所以涨的也没有那么快。

你可能感兴趣的:(性能分析——node内存泄露)