Node.js API与并发连接窒息

这是我第一次使用Node.js和Mongo,所以请原谅任何无知。 我来自PHP的背景。 这是我的理解,Node.js规模很好,因为它的事件驱动的性质。 因此,我在节点中构build了API,并在本地主机上进行了testing。 今天,我把它部署到我的云服务器,一切都很好,除了…

随着请求开始堆积,开始需要很长时间才能完成。 只有2个客户端连接到API,当两个客户端都试图同时发出多个请求(有时会发生这种情况)时,我已经看到了30秒+的页面加载时间。

API所做的大部分工作是:(a)读取/写入MongoDB,驻留在云中的第二台服务器上;(b)向其他API,网站等发出请求并返回结果。 这两个操作都不应该被阻塞,但是我可以想象这个问题是在MongoDB服务器(a)还是在外部API(b)上遇到瓶颈的问题。

当然,我最终将拥有多个应用程序服务器,但我希望每个人都可以处理多个并发客户端而不会窒息。

一些注意事项:1)我有一些console.logs,我留在我的节点代码,我有一个SSH客户端打开来监视云服务器。 我怀疑这可能会导致放缓2)我使用快递,mongoose,Q,请求,和一些其他模块

感谢您花时间帮助节点newb;)


编辑:添加一些性能图后,下面的一些反应… Apache连接CPU使用率


编辑:这是一个典型的callback – 它由快速路由器调用,它使用Q模块和OAuth进行Facebook的Post API调用:

post: function(req, links, images, callback) { // removed some code that calculates the target (string) and params (obj) variables // the this.request function is a simple wrapper around the oauth.getProtectedResource function Q.ncall(this.request, this, target, 'POST', params) .then(function(res){ callback(null, res); }) .fail(callback).end(); }, 

编辑:一些“upsert”代码

 upsert: function(query, callback) { var id = this.data._id, upsertData = this.data.toObject(), query = query || {'_id': id}; delete upsertData._id; this.model.update(query, upsertData, {'upsert': true}, function(err, res, out){ if(err) { if(callback) callback(new Errors.Database({'message':'the data could not be upserted','error':err, 'search': query})); return; } if(callback) callback(null); }); }, 

无可否认,我对Q / promise的了解很薄弱。 但是,我认为我一贯坚持以不阻碍的方式实施

您的问题提供了一半的相关数据:技术堆栈。 但是,在debugging性能问题时,还需要另一半的数据:性能指标。

你正在运行一些“云服务器”,但不清楚这些服务器在做什么。 他们刺在CPU上? 内存? 在IO上?

有很多潜在的问题。 您是否在生产模式下运行Express? 你在MongoDB服务器上占用了太多的IO吗? 你是否合法地下载了太多的数据? 你有没有陷入无限的Node.JS循环? ( 它发生

我想提供更好的build议,但不知道所涉及的服务器的状态,真的不可能开始挑选任何特定的底层技术。 你可能是一个“Node newb”,但是基本的服务器监控在各种编程语言中是相当标准的。


感谢您提供额外的细节,我将重申上述评论中最重要的部分: 这些服务器在哪里被封锁?

  • 中央处理器? ( 显然不是从你的图表
  • 记忆? ( 在这里似乎不太可能
  • IO? ( IO图在哪里,你的数据库服务器在做什么?