NodeJS、Express和Mongoose:调用间歇性缓慢

7
我是一个有用的助手,可以将文本翻译成中文。
我有一个非常简单的NodeJS应用程序。出于某种原因,服务器的响应时间差异很大。
这是我的app.js:
var express = require('express');
var http = require('http');
var path = require('path');
var Models = require('./schema/schema.js');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.static(path.join(__dirname, 'public')));

app.use(function(req, res, next) {
    var start = Date.now();

    res.on('header', function() {
        var duration = Date.now() - start;
        var time = Date.now() - req.start;

        fs.appendFile("times.txt", time+"\n", function (err) {});

    });
    next();
});
app.use(app.router);



app.get("/tags", function(req, res) {
    var query = Models.Tag.find({}).sort({'popularity': -1}).limit(200);
    query.exec(function(err, tags) {
        res.status(200);
        res.send(tags);
    });
}

数据始终返回正确,但这是我的响应时间,由“header”函数测量:
19
11
13
6
10
10
8
9
2
62449
57862
24919
9975
11
17
21116
10
3
2
2
13

大多数延迟不到10毫秒,但经常会有一些超过一分钟。发生了什么事情?
架构:
var tagSchema = new mongoose.Schema({
    name : {
        type: String,
        trim: true
    },
    popularity :{
        type:Number, default:0
    },
    created_date: {
        type:Date, default:Date.now
    },
    last_update: {
        type:Date, default:Date.now
    }
});

不,我猜不是。那会对性能造成很大的影响吗? - Jason
不,这绝对不应该是一个大问题。这真的是一个非常奇怪的模式。我的直觉是有一些磁盘 IO 发生了某些情况,或者交换文件被用于 mongo hotset,但这仍然无法解释这样一个巨大的跳跃。集合中有多少个文档? - Chris Tinsley
1
数据库在哪里?在你的电脑上吗?还是在某个SaaS上免费实例化了? - mpm
2
我不相信这是一致的行为,甚至可能无法再现。这看起来非常像您正在虚拟机上运行,并且实际硬件环境中确实有其他事情影响了结果。一个包含200条记录的工作集合不可能用其他方式解释。 - Neil Lunn
1
我认为你需要收集更多的信息,现在你所知道的只是某些东西很慢。检查一下Mongo中是否有任何缓慢的查询:http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/。然而,我必须同意@NeilLunn的看法,即使你认为你没有,你可能正在运行某种共享托管平台。 - Daniel
显示剩余5条评论
1个回答

1

你是否尝试过使用托管的Mongo服务器,例如mongohq,只是为了查看是否存在本地IO延迟问题?这么小的数据库不应该有任何问题,除非你正在做一些疯狂的事情,而显然你没有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接