Node.js 的可伸缩性是不是会因为高负载下的垃圾收集而受到影响?

Posted

技术标签:

【中文标题】Node.js 的可伸缩性是不是会因为高负载下的垃圾收集而受到影响?【英文标题】:Does Node.js scalability suffer because of garbage collection when under high load?Node.js 的可伸缩性是否会因为高负载下的垃圾收集而受到影响? 【发布时间】:2011-09-04 18:51:28 【问题描述】:

虽然 Node.js 是相当热门的话题,但我碰巧发现据报道 Node.js 可能不适合实时应用程序,因为它的垃圾收集模型(http://amix.dk/blog/post /19577)。而且,一些基准测试表明,与 RingoJS 相比,Node.js 的响应速度较慢(http://hns.github.com/2010/09/29/benchmark2.html)。

目前,Node.js 绑定到 V8 javascript 引擎,该引擎使用分代的 stop-the-world GC。

那么,当传入的请求很大时,Node.js 会被破坏吗? 如果有真实的生产统计数据,那就更好了。

谢谢

【问题讨论】:

如果你有足够的连接让 GC 产生影响,那么你将运行节点作为跨核心扩展的多个进程。这至少会减少 GC 的“伤害”。 这可能会带来更高的吞吐量,但不会缓解 GC 启动时的高延迟问题。 【参考方案1】:

垃圾回收的成本取决于堆中对象的数量,尤其是长寿命对象的数量。拥有的越多,花在 GC 上的时间就越多。

是的,如果堆很大,V8 目前有时会进行一些相当大的 GC 暂停。听起来 V8 团队正在努力通过分散工作来最小化每次 GC 暂停的成本。以--trace-gc开头,你可以在自己的节点程序中看到GC的成本。

对于许多应用程序来说,GC 的成本被越来越优秀的优化编译器所抵消。我建议尝试一个简单的程序并测量 V8 报告的 GC 成本以及测量客户端到客户端的延迟。我发现当客户端通过开放 Internet 进行连接时,GC 成本几乎可以忽略不计。

【讨论】:

以上是关于Node.js 的可伸缩性是不是会因为高负载下的垃圾收集而受到影响?的主要内容,如果未能解决你的问题,请参考以下文章

千万级流量架构下的负载均衡解析

keepalived+LVS 实现双机热备负载均衡失效转移 高性能 高可用 高伸缩性 服务器集群

高负载应用的最佳节点 ORM 模块

谈一谈最近学了一段时间的node.js

随想之五-高可用和可伸缩

nodejs每秒并发多高