node.js - 如何确定 MongoDB 或 Node.js 是否是瓶颈?
问题描述
一般来说,我对系统设计很陌生,所以让我尽我所能解释我的问题!
我有两个 EC2 t2.micro 实例正在运行:一个是我的 MongoDB,它存储了 10,000,000 条主要记录,另一个是我的快速服务器。
我的 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,并且我使用的查询是否为我确定了这一点(在这种特定情况下)?
解决方案
我建议您从 mongodb 控制台开始,详细探索您的查询。这样您就可以将 mongodb 行为与驱动程序行为隔离开来。
分析查询的一个好方法是:
cursor.explain()
- https://docs.mongodb.com/manual/reference/method/cursor.explain/$explain
- https://docs.mongodb.com/manual/reference/operator/meta/explain/
如果您的目标是完美的数据库性能调优,您需要了解查询执行的每一个细节。掌握它需要一些时间,但这是完全值得的!
另一个有趣的细节是生产中的真实性能监控和分析,它揭示了应用程序中瓶颈的真实情况,而不是更“无菌”的非生产压力测试。这是一个很好的分析器,它允许您在应用程序中插入自定义分析点,并轻松打开和关闭分析,而无需重新启动应用程序:
https://www.npmjs.com/package/mc-profiler
一个好的做法是首先让应用程序作为测试版在生产环境中运行,检查分析数据并优化慢代码。否则,您可能会浪费大量时间进行一些优化,这对一般应用程序性能几乎没有影响。
推荐阅读
- python - Getting error when plotting a figure with sublpots using axes in matplotlib
- javascript - 没有本地主机的 Socket.io
- makefile - 将 glob 模式指定为 Makefile 目标
- linux - 获取许多相似字符串中的第一个
- python - 根据字段位置将 Pandas 数据框导出到 txt
- javascript - 如何让我的机器人发送命令让单独的机器人做某事?
- javascript - API数据的Vue.js用户过滤器不起作用 - 未捕获的语法错误:意外的令牌:
- git - 我没有从master分支出来,而是从一个分支分支出来
- twilio - 呼叫转移+短信+耳语?
- vue.js - 页面重新加载导致 Vuex getter 返回 undefined