我有数据进入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 - -
答案 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的性能,您可以执行以下两项操作:
调整连接池;这样,您的代码将在每次执行某些操作时重用现有的连接,而不是创建新的连接,默认情况下,它的5个尝试扩展它。
在集合中创建索引;创建唯一/复合索引,这肯定会提高您的查询性能。
此外,您还可以运行explain命令来查看整个查询的执行和分析。
查看以下内容:MongoDB Performance