对MongoDB的重复Node.js请求最终减慢

时间:2016-05-30 03:41:18

标签: javascript node.js mongodb mongoose

我有数据进入MongoDB集合rmc并且它被插入,即我有一个点与我的设备的最新经纬度。

从Node.js,我想每100 ms查询该集合(以模拟实时)并使用更新的纬度/经度更新地图。

我首先获得了良好的性能,但是在我的收藏中更新数据或者只是一段时间之后,性能开始变得非常糟糕。

我做错了什么?我能以更好的方式做事吗?我似乎无法确定 MongoDB 节点,或 Mongoose

用户转到index.html,它会抓取HTML页面。在HTML中,我每100毫秒请求一个页面:

function updateData() {
  $.getJSON("/data", function(json) {
    dosomething()
    interval = setTimeout(updateData, 100);
  })
};

updateData();

我的index.js:

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: "test" });
});

router.get('/data', function(req, res, next) {
  var db = req.db;
  Json.find({}).select({}).lean().exec(function(e,docs){
    res.json(docs);
  });
});

事情很好,突然间,经历了巨大的延迟:

GET /data 304 1.644 ms - -
GET /data 304 1.738 ms - -
GET /data 304 1.685 ms - -
GET /data 304 1.693 ms - -
GET /data 304 1.624 ms - -
GET /data 304 1.645 ms - -
GET /data 304 1.873 ms - -
GET /data 304 1.607 ms - -
GET /data 304 1.638 ms - -
GET /data 304 1.610 ms - -
GET /data 304 1.734 ms - -
GET /data 304 1.736 ms - -
GET /data 304 1.660 ms - -
GET /data 304 1.634 ms - -
GET /data 304 15.265 ms - -
GET /data 304 10.535 ms - -
GET /data 304 1.740 ms - -
GET /data 304 70.184 ms - -
GET /data 304 69.037 ms - -
GET /data 304 58.620 ms - -
GET /data 304 75.053 ms - -
GET /data 304 72.292 ms - -
GET /data 304 92.447 ms - -
GET /data 304 95.270 ms - -
GET /data 304 448.057 ms - -
GET /data 304 567.309 ms - -
GET /data 304 683.199 ms - -
GET /data 304 731.952 ms - -
GET /data 304 1102.502 ms - -
GET /data 304 1770.029 ms - -
GET /data 304 1051.307 ms - -
GET /data 304 1059.791 ms - -

4 个答案:

答案 0 :(得分:1)

我认为您正在将输出传递给许多功能不多的功能。同样,如果输出很小,则可以发送所有数据作为响应似乎可以。尝试将代码修改为

const docs = await Json.find({})
res.json(docs)

您不需要lean()或select()。他们什么也没做

答案 1 :(得分:0)

可能有不同的方法来分析节点应用程序以找出问题的根源。使用本机节点,您可以尝试运行您的应用程序:

 node --prof <entrypoint>.js

然后尝试运行测试以允许节点收集一些数据,完成后将生成一个文件,该文件必须转换为具有更好的人性化输出的文件

node --prof-process <file_generate>.log > processed.txt

进入processed.txt,您可以找到代码的哪些部分花费更多的CPU时间,因此可以将您潜在地指向问题发生的地方。

有关更多详细信息,节点文档中有一个很好的条目,用于分析概要文件https://nodejs.org/en/docs/guides/simple-profiling/

答案 2 :(得分:0)

您必须在代码中以及完整的代码中看到查询的执行时间(可以使用控制台语句),并查看查询是否占用时间或其他任何代码。监控CPU的使用情况,并查看哪个进程占用了多少资源。 您可以查看任何mongodb查询的执行状态 https://docs.mongodb.com/manual/reference/operator/meta/explain/

另外在开发中以调试模式运行猫鼬。

mongoose.set('debug', true);

答案 3 :(得分:0)

要提高mongoDB的性能,您可以执行以下两项操作:

  1. 调整连接池;这样,您的代码将在每次执行某些操作时重用现有的连接,而不是创建新的连接,默认情况下,它的5个尝试扩展它。

  2. 在集合中创建索引;创建唯一/复合索引,这肯定会提高您的查询性能。

此外,您还可以运行explain命令来查看整个查询的执行和分析。

查看以下内容:MongoDB Performance