我使用 node.js 0.10.18(在 Amazon EC2 上)作为我们的 ios 游戏 http 服务器。
我使用process.memoryUsage()
来打印内存使用情况。
我发现我们 Node 的内存使用异常。
运行两天后:
machine1
上的 Node :
2014-10-13T02:35:04.782Z - 重要:进程:heapTotal 119.70 MB heapUsed 84.62 MB rss 441.57 MB
machine2
上的 Node :
2014-10-13T02:36:01.057Z - 重要:进程:heapTotal 744.72 MB heapUsed 108.19 MB rss 1045.53 MB
结果是:
两个
heapUsage
都非常小,与 Node 进程运行多长时间无关。machine2
上的heapTotal
比heapUsed
大得多,并且在我重新启动进程之前它永远不会变小。但machine1
上的heapTotal
似乎正常。machine1
是 Amazon EC2 m3.xlarge,machine2
是 Amazon EC2 m3.medium。从Amazon CloudWatch我知道machine2
的性能不足,有时machine2
的CPU使用率达到100%。那么heapTotal
使用异常是否与硬件不足有关呢? 100% 的 cpu 使用率不是我们的 Node 进程的结果,因为使用node-usage
模块我发现我们的 Node 进程的 cpu 使用率永远不会高于 50%。我认为使用情况被相邻虚拟机窃取(您知道 Amazon EC2 上有共享的 CPU 时间)。我知道缓冲区内存使用量 =
(rss - heapTotal)
。我发现两台机器上的缓冲内存使用量都会逐渐增加。可以看到,运行两天后,两个缓冲内存使用量都超过了300MB。
我的问题是:
为什么即使
heapUsed
很小,heapTotal
使用量也不会被释放?是 Node 本身的问题还是我自己代码的一些错误?解决这个问题的唯一办法就是升级硬件吗?为什么缓冲区使用量逐渐增加?这是否意味着存在内存泄漏?是 Node 本身的问题还是我自己代码的一些错误?或者直接忽略它?
谢谢!
最佳答案
来自这篇文章https://www.joyent.com/blog/walmart-node-js-memory-leak 。我发现<= 0.10.21版本存在内存泄漏bug。并且在0.10.22版本中修复了该bug
我将node升级到最新版本0.10.32,并且还增强了machine2的硬件。
这两个内存问题再也没有出现过。两者的内存使用每天只会增加几MB,我认为这是正常的,因为我的 Node 进程会缓存一些玩家数据。
因此,这两个问题可能是由同一原因引起的,并且已得到修复。
关于node.js - 这是否意味着 Node.js 中存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26332508/