Javascript node.js express上的MongoDB查询在负载测试下变得非常缓慢

Javascript node.js express上的MongoDB查询在负载测试下变得非常缓慢,javascript,node.js,performance,mongodb,express,Javascript,Node.js,Performance,Mongodb,Express,我开始在运行mongodb的node.js/express web应用程序上进行一些负载测试。我有一个特定的页面,通过点击一个端点来加载,如下所示: app.get("/project/:pid", function(req, res) { // project.viewProject(db, req, res); project.viewProjectSimple(db, req, res); }); 这反过来调用一个函数,该函数将显示与pid关联的项目页面。我已经尽可能地简化了它,只包含一

我开始在运行mongodb的node.js/express web应用程序上进行一些负载测试。我有一个特定的页面,通过点击一个端点来加载,如下所示:

app.get("/project/:pid", function(req, res) {
// project.viewProject(db, req, res);
project.viewProjectSimple(db, req, res);
});
这反过来调用一个函数,该函数将显示与pid关联的项目页面。我已经尽可能地简化了它,只包含一个db查询,但即使在一个小的压力测试下,函数仍然会崩溃

以下是呈现项目的函数:

exports.viewProjectSimple = function(db, req, res) {
console.time("project");
var pid = req.params["pid"]*1;
console.time("1");
db.collection("projects").findOne({pid:pid}, function(err, project) {
    console.timeEnd("1");
    if( !project )
        res.send("No such project...");
    else {
        console.time("2");
        project.user = {};
        project.user.name = "test";
        if( project.created )
            project.niceCreatedDate = utility.niceDate(project.created);
        if( project.totalTime )
            project.niceEditTime = utility.niceTimeDelta(project.totalTime);
        console.timeEnd("2");
        console.time("3");
        if( !project.stats )
            project.stats = getProjectStats(db, project);
        var uid = req.user ? req.user.uid : -1;
        if( project.description )
            project.descriptionHTML = markdown.toHTML( project.description, 'Gruber' );
        console.timeEnd("3");
        var renderProject = function() {
            console.time("4");
            var projectPath =  "public" + project.path;
            var screenshotPath = projectPath + "/info/screenshot.png";
            console.timeEnd("4");
            console.timeEnd("project");
            res.render("project", {
                title: "Project: "+project.name,
                user: req.user,
                customScript: "projectPage.js",
                scripts: ['/js/bootstrap.min.js', '/js/bootbox.min.js'],
                stylesheets: [ '/js/bootstrap.min.css'],
                permissions: getPermissionsHelper(req, project),
                project:project,
                message: req.flash("project")
            });             
        }
            renderProject();        
    }
}); 
}
当与单个用户一起运行时,db查询需要10-15秒,以下是计时调用的输出:

1: 11ms
2: 0ms
3: 0ms
4: 0ms
project: 12ms
我一直在运行blaze meter压力测试,20个模拟用户一次又一次地访问项目页面,当20个用户达到峰值时,性能崩溃,完成查询大约需要15秒:

1: 14145ms
2: 0ms
3: 1ms
4: 0ms
project: 14147ms
projects表只有31570个条目,所以我认为这不是问题所在。这是目前运行在一个单一的亚马逊ec2微型服务器与一个单一的核心,它最大限度的cpu在这个测试


有谁能告诉我这里发生了什么。

正在查询的字段是否已编制索引?如果不是,那么可能应该是因为您只查找单个值,而且如果是这样,那么如果只是单个结果,为什么不使用_id字段呢?您还应该查看服务器本身的查询性能,因为这并不确定是查询操作还是节点应用程序是这里的瓶颈。增加连接池大小并检查应用程序的内存利用率。简而言之,除了这个简单的测试之外,还有许多原因需要研究。@BlakesSeven该字段没有索引,这样做确实有很大帮助,现在在最多20个用户的负载测试期间,查询需要3000-7000ms。我不完全确定您在服务器上查看查询性能是什么意思,我正在一个amazon实例上运行这些测试,该实例是live server的精确副本。非常感谢您的回复。监视服务器意味着实际的mongod实例本身,在那里可以获得更多信息。我主要讨论的是发出查询的程序与实际执行时间之间的差异,因为condsider也有网络延迟。您还可以考虑为应用程序和可能的数据库使用的实例在您想要的使用规范下。