小编dsp*_*vey的帖子

node.js/Express抛出'RangeError:在高负载下超过'最大调用堆栈大小

我们在高负载下运行的节点环境存在问题,而我们无法找到源代码.

一点背景:我们正在使用Express为http框架运行集群节点应用程序.目前,有3个盒子,每个盒子有8个CPU核心,每个盒子运行一个由6个节点工作者组成的集群.设置似乎很好,我已经研究了所有建议的方法,我相信设置是可靠的.我们使用Express 2.5.11和XMLHttpRequest 1.4.2运行node.js 0.8.1.

问题在于:我们正在对该产品进行"暗启动"测试(即浏览器客户端代码在后台对我们的API调用javascript ajax,但未在页面上使用或向用户显示).成功运行几分钟后,系统抛出:

[RangeError: Maximum call stack size exceeded]
Run Code Online (Sandbox Code Playgroud)

我们正在使用集群控制器(启动每个worker)中的'uncaughtException'事件来捕获错误,但是在该级别没有可用的堆栈跟踪.我已经对这个问题进行了广泛的研究,似乎找不到任何有类似错误的人.梳理完系统中的每一行代码后,这就是我所知道的:

  • 我找不到任何递归或循环引用.(我已经读过这个错误并不总是意味着一个递归问题,但我们已经检查过了;我们实际上已经通过删除大部分代码来运行测试,但它仍然会发生,见下文);
  • 我已经下到每个盒子1个工作进程尝试消除群集作为一个问题 - 问题仍然发生;
  • 这个问题只发生在高负荷下.我们的交通量约为.每秒1500页,在繁忙的交通时间内,每秒可达到15000页(我们无法在开发环境中复制);
  • 捕获错误的时间有所不同,但通常在15分钟内;
  • 该错误似乎不会影响操作!通过这个,我的意思是没有腐败的反应,除了偶尔的超时,系统永远不会崩溃;
  • 陷阱错误的工作进程会在几秒钟后恢复并再次开始提供请求;
  • 我在最基本的设计上遇到了错误 - 没有调用其他API.只需提出请求并回复简单的json响应即可.这是最奇怪的部分.在我的任何代码中,系统似乎都没有失败 - 如果没有实例化任何类来完成实际工作,它就会失败.显然,我开始使用更多的代码,但是慢慢地将它们分开,直到它仍然在一个简单的设置下失败.

我认为,最明显的症状是错误总是在请求完全服务之后发生.也就是说,服务器接收请求,找到正确的Express路由,调用res.send,并且完成.这对我来说真的像垃圾收集!我已经读过V8引擎有一个非常好的GC引擎,但我想知道我们的重负荷是多少影响了事情.

正如我所说,即使在基本设计上,代码也会抛出错误.取出大部分自定义代码后,这就是设置的基础知识.很抱歉,我正在这里切割,所以并不是所有的变量声明等都会被包含在内,但代码确实有效,所有这些东西都在真正的代码中:

集群控制器.这是在命令行上启动的清理版本.

cluster = require('cluster');
path = require('path');
fs = require('fs');
app = require('./nodeApi');
_ = require('underscore');
nodeUtil = require(./nodeUtil);

process.on('uncaughtException', function(err) {
  var stamp;
  stamp = new Date();
  console.log("***************************** Exception Caught, " + stamp);
  return console.log("Exception is:", err);
});

if (cluster.isMaster) {
  if ((nodeUtil.isLiveServer() || nodeUtil.isCluster()) && process.env.IS_CLUSTER !== …
Run Code Online (Sandbox Code Playgroud)

javascript stack-overflow garbage-collection node.js express

20
推荐指数
1
解决办法
6753
查看次数