2

这是我第一次使用 Node.js 和 Mongo,所以请原谅任何无知。我来自 PHP 背景。我的理解是 Node.js 之所以可以很好地扩展,是因为它具有事件驱动的特性。因此,我在 node 中构建了我的 API,并一直在 localhost 上对其进行测试。今天,我将它部署到我的云服务器上,一切正常,除了......

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

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

当然,我最终会拥有多个应用服务器,但我希望每个服务器能够处理多个并发客户端而不会阻塞。

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

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


编辑:在下面的一些回复之后添加了一些性能图的图片...... 阿帕奇连接 CPU使用率


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

4

1 回答 1

3

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

您正在运行一些“云服务器”,但不清楚这些服务器实际在做什么。他们在 CPU 上飙升吗?在内存上?在 IO 上?

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

我想提供更好的建议,但在不知道所涉及服务器的状态的情况下,真的不可能开始挑选任何特定的底层技术。您可能是“节点新手”,但基本的服务器监控是跨编程语言的标准。


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

  • 中央处理器?(显然不是你的图表
  • 记忆?(这里似乎不太可能
  • IO?(IO 图在哪里,你的数据库服务器在做什么?
于 2012-07-18T18:17:52.450 回答