Node.js API与并发连接窒息

时间:2012-07-18 17:08:31

标签: node.js mongodb

这是我第一次使用Node.js和Mongo,所以请原谅任何无知。我来自PHP背景。据我所知,Node.js因其事件驱动的性质而得分很好。因此,我在节点中构建了我的API并且已经在本地主机上测试它。今天,我将它部署到我的云服务器,一切都很好,除了......

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

API完成的大部分工作是(a)读取/写入MongoDB,它驻留在云上的第二台服务器上(b)向其他API,网站等发出请求并返回结果。这两个操作都不应该阻塞,但我可以想象这个问题与Mongo DB服务器(a)或外部API(b)上的瓶颈有关。

当然,我最终会有多个应用程序服务器,但我希望每个服务器都可以处理多个并发客户端而不会出现阻塞。

一些注意事项: 1)我在节点代码中留下了一些console.logs,我打开了一个SSH客户端来监控云服务器。我怀疑这可能导致减速 2)我使用express,mongoose,Q,request和一些其他模块

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


编辑:在下面的一些回复之后添加了一些性能图表的图片... Apache connections CPU usage


编辑:这是一个典型的回调 - 它由快递路由器调用,它使用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的了解很少。但是,我认为我一直以不阻止的方式实施它们......

1 个答案:

答案 0 :(得分:3)

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

您正在运行一些“云服务器”,但目前尚不清楚这些服务器实际上在做什么。它们是否在CPU上飙升?在记忆?在IO?

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

我想提供更好的建议,但不知道所涉及的服务器的状态,开始选择任何特定的底层技术是不可能的。您可能是“Node newb”,但基本的服务器监控在编程语言中非常标准。


感谢您提供额外的详细信息,我将重新审核上述评论中最重要的部分:这些服务器被阻止在哪里?

  • CPU? (显然不是来自您的图表
  • 存储器? (似乎不太可能
  • IO? ( IO图表在哪里,您的数据库服务器在做什么?