javascript - Node.js 和碎片化

标签 javascript node.js memory-management garbage-collection v8

背景:我来自微软世界,我曾经将网站存储在 IIS 上。经验告诉我每天回收一次我的应用程序池,以消除由于碎片导致的奇怪问题。回收应用程序池基本上意味着在不重新启动整个 IIS 的情况下重新启动应用程序。我还观看了一个讲座,该讲座解释了微软如何在 .Net 4.5 中大大减少了碎片化。

现在,我正在将 Node.js 应用程序部署到生产环境中,我必须确保它始终能够完美运行。我原本想让我的应用程序每天重启一次。然后我做了一些研究,以便找到有关 Node.js 中碎片问题的一些线索。我发现的唯一东西是来自 an article describing GC in V8 的一段片段。 :

To ensure fast object allocation, short garbage collection pauses, and the “no memory fragmentation V8” employs a stop-the-world, generational, accurate, garbage collector.

这个说法确实不足以让我放弃为我的应用构建重启机制,但另一方面如果没有问题我不想做一些工作。

所以我的问题是:

我是否应该不时重启我的应用以防止碎片化?

最佳答案

在您知道内存消耗确实是一个问题之前实现服务器重启是一种过早的优化。因此,我认为在您真正发现这是一个问题之前,您不应该这样做。与内存消耗相比,您可能会发现更重要的问题需要优化。

要确定是否需要重新启动服务器,我建议您执行以下操作:

  1. 设置一些监控工具,如 https://newrelic.com/让你监控你的表现。
  2. 持续监控您的内存。尝试查看消耗的内存量是否稳定增加,或者是否趋于平稳。
  3. 在您需要采取行动之前确定一个可接受的阈值。例如,一旦您的应用消耗了 60% 的系统内存,您就需要开始考虑重启服务器并决定重启间隔。
  4. 决定您是否可以在重新启动服务器时出现“停机时间”。如果您不想停机,您可能需要构建一个代理层来引导流量。

一般来说,我建议为所有动态的垃圾收集语言重新启动服务器。这在那些类型的大型应用程序中相当普遍。代码库中某处的小错误或您所依赖的库之一几乎不可避免地会泄漏内存。即使你修复了一个泄漏,你最终也会得到另一个。这可能会让您的团队感到沮丧,这基本上会导致服务器重启策略,以及在您的应用程序的内存消耗方面可接受的定义。

关于javascript - Node.js 和碎片化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40494672/

相关文章:

javascript - 如何在全局变量中存储 $.getJSON 对象并稍后浏览它

node.js - express-session 浏览器关闭时更改 session

c - 存在什么(更优雅的)方法来解析离散的数据 block ,就好像它们是一个数据 block 一样?

c - 整数数组到 char 指针字符串

javascript - ionic 2 : Access to a variable value from a provider or page

Javascript替换每个字符串的第一个字母?

html - ejs模板是如何加载到浏览器上的?前端如何与后端交互?

node.js - 如何将socket.io与mean.io一起使用

c# - C#中如何处理大量数据?

javascript - 如何在 jQuery 中迭代 JSON 的嵌套数组?