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

时间:2015-09-30 00:29:00

标签: javascript node.js performance mongodb express

我开始在运行mongodb的node.js / express web app上进行一些负载测试。我有一个特定的页面,通过点击这样的结束点加载:

app.get("/project/:pid", function(req, res) {
// project.viewProject(db, req, res);
project.viewProjectSimple(db, req, res);
});

这又调用一个函数,该函数将显示与pid相关联的项目页面。我尽可能简化了这一点,只包含一个数据库查询,但即使是轻微的压力测试,该函数仍会崩溃。

以下是呈现项目的功能:

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

我一直在进行火焰计压力测试,该测试会在20个模拟用户中反复点击项目页面,当它在20个用户达到峰值时性能崩溃,完成查询大约需要15秒:

1: 14145ms
2: 0ms
3: 1ms
4: 0ms
project: 14147ms

项目表只有31570个条目,所以我不认为这是个问题。目前这是在一个单核心的amazon ec2微服务器上运行,它在此测试期间最大化了cpu。

任何人都可以告诉我这里发生了什么。

0 个答案:

没有答案