如何确定MongoDB或Node.js是瓶颈?

时间:2020-09-11 04:03:51

标签: node.js mongodb express

我对系统设计总体上还是很陌生,所以让我尝试尽我所能来解释我的问题!

我有两个正在运行的EC2 t2.micro实例:一个实例存放我的MongoDB,该实例存储10,000,000个主记录,另一个实例上装有我的Express服务器。

我的MongoDB文档的结构如下:

{
  _id: 1,
  images: ["url_1.jpg", "url_2.jpg", "url_3.jpg"],
}

这是我的mongo连接的样子:

const { MongoClient } = require('mongodb');
const { username, password, ip } = require('./config.js');

const client = new MongoClient(`mongodb://${username}:${password}@${ip}`,
  { useUnifiedTopology: true, poolSize: 10 });

client.connect();

const Images = client.db('imagecarousel').collection('images');

module.exports = Images;

我正在使用loader.io对我的服务器GET API端点运行1000PRS压力测试。第一个测试使用.findOne()查询,第二个测试使用.find().limit(1)查询,如下所示:

const query = { _id: +req.params.id };
Images.findOne(query).then((data) => res.status(200).send(data))
    .catch((err) => {
      console.log(err);
      res.status(500).send(errorMessage);
    });

//////////////////////////////////////////

const query = { _id: +req.params.id };
Images.find(query).limit(1).toArray().then((data) => res.status(200).send(data[0]))
    .catch((err) => {
      console.log(err);
      res.status(500).send(errorMessage);
    });

当我查看《 New Relic》的结果时,我对看到的东西感到有些困惑:New Relic Results

经过研究,我发现这与.findOne()返回文档和.find()返回光标有关系吗?

所以我的问题是:如何确定瓶颈是node.js还是MongoDB,我使用的查询是否对我确定(在这种情况下)?

1 个答案:

答案 0 :(得分:1)

我建议您从mongodb控制台开始,并详细探讨您的查询。这样,您就可以将mongodb行为与驱动程序行为隔离开来。

一种分析查询的好方法是:

如果您希望完美地调整数据库性能,则需要了解执行查询的每个细节。要花一些时间来掌握它,但这是完全值得的!

另一个有趣的细节是生产中的真实性能监视和性能分析,它揭示了应用程序中瓶颈的真实情况,而不是更“无菌”的非生产压力测试。这是一个很好的分析器,它使您可以在应用程序中插入自定义性能分析点,并且无需重新启动应用程序即可轻松地打开和关闭性能分析:

https://www.npmjs.com/package/mc-profiler

一种好的做法是,首先让该应用程序作为Beta运行在生产环境中,检查性能分析数据并优化慢速代码。否则,您可能会浪费大量时间进行一些优化,而这些优化对一般应用程序的性能几乎没有影响。

相关问题