【问题标题】:How do I determine if MongoDB or Node.js is the bottle neck?如何确定 MongoDB 或 Node.js 是否是瓶颈?
【发布时间】:2020-09-11 13:42:01
【问题描述】:

总的来说,我对系统设计非常陌生,所以让我尽我所能解释我的问题!

我有两个 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,并且我使用的查询是否为我确定了这一点(在这种特定情况下)?

【问题讨论】:

标签: node.js mongodb express


【解决方案1】:

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

分析查询的好方法是:

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

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

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

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

【讨论】:

  • 谢谢 - 这看起来是我更好地理解我自己的问题的一个很好的起点!
猜你喜欢
  • 2020-10-28
  • 2010-11-18
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多