这是否意味着node.js中的内存泄漏?
我使用node.js 0.10.18(在Amazon EC2上)作为我们的ios游戏http服务器。
我使用process.memoryUsage()
来打印内存使用情况。 我发现我们的节点的内存使用情况是不正常的。
运行两天后:
machine1
节点:
2014-10-13T02:35:04.782Z – 重要:进程:堆总计119.70 MB heap使用84.62 MB的RSS 441.57 MB的
machine2
节点:
2014-10-13T02:36:01.057Z – 重要:进程:堆总计744.72 MB heap使用108.19 MB的RSS 1045.53 MB
结果是:
-
这两个
heapUsage
都非常小,它与节点进程运行多长时间无关。 -
machine2
上的heapTotal
比heapUsed
,在重新启动过程之前,它永远不会变小。 但machine1
heapTotal
看起来很正常。machine1
是Amazon EC2 m3.xlarge,machine2
是Amazon EC2 m3.medium。 从Amazon CloudWatch中我知道machine2
的性能不足,有时machine2
的CPU使用率会达到100%。 那么exceptionheapTotal
使用情况是否与硬件的不足有关? 100%的CPU使用率不是我们节点进程的结果,因为使用node-usage
模块,我看到我们节点进程的CPU使用率永远不会高于50%。 我认为这个用法是被邻近的虚拟机盗取的(你知道在Amazon EC2上有共享的CPU时间)。 -
我知道缓冲区内存使用情况=
(rss - heapTotal)
。 我发现两台机器上的缓冲区内存使用量会逐渐增加。 你看,两天运行两次缓冲存储器的用量都超过了300MB。
我的问题是:
-
为什么
heapTotal
即使heapUsed
非常小也不会释放heapTotal
使用情况? 是节点本身的问题,还是我自己的代码的一些错误? 是解决它升级硬件的唯一方法吗? -
为什么缓冲区使用量逐渐增加? 这是否意味着有内存泄漏? 是节点本身的问题,还是我自己的代码的一些错误? 或者只是忽略它?
谢谢!
从这个posthttps://www.joyent.com/blog/walmart-node-js-memory-leak 。 我发现在<= 0.10.21版本中有一个内存泄漏错误。 该错误在版本0.10.22中得到修复
我升级了节点到最新的版本0.10.32,并增强了machine2的硬件。
两个内存问题都不会再出现。 两者的内存使用量每天只会增加几MB,我认为这是正常的,因为我的节点进程会caching一些玩家数据。
所以也许这两个问题是由同样的原因造成的,而且已经修复了。