如何解决Mongodb,NodeJS CPU不断增加
我们遇到一个问题,即每隔一段时间我们的节点应用程序的节点应用程序在100%CPU上运行。该服务器不是很活跃,通常在0%-2%CPU上运行。我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法是什么。
服务器端代码下方的代码
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mongo = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1:27017";
const fs = require('fs');
var port = process.env.PORT || 3110;
io.on('connection',function (socket) {
console.log("connected");
MongoClient.connect(url,{ useUnifiedTopology: true },function (err,db) {
socket.broadcast.on('getMessages',function (msg) {
var dbo = db.db("Hitesh");
if (err) throw err;
console.log(msg)
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).sort({ $natural: -1 }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err,result) {
if (err) throw err;
result.slice().reverse().forEach(element => {
io.to(socket.id).emit(msg["roomId"],element);
});
//db.close;
});
});
socket.broadcast.on('getMessages_once',function (msg) {
// MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
if (err) throw err;
console.log(msg)
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).sort({ $natural: -1 }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err,result) {
if (err) throw err;
console.log(result.length);
io.to(socket.id).emit(msg["roomId"] + "_once",result.reverse());
// result.slice().reverse().forEach(element => {
// });
//db.close;
});
//});
});
//---- send message to from client--///
socket.broadcast.on('sendMessage',function (msg) {
//MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
if (err) throw err;
dbo.collection(msg["collectionName"]).insertOne(msg["data"],res) {
if (err) throw err;
var messsageData = {
"roomId": msg["roomId"],"messageId": msg["messageId"],"collectionName": "conversations"
};
getMessageCount(messsageData);
console.log("1 document inserted");
msg["limit"] = "1";
msg["total"] = "0";
var val = { $set: msg["lastMessage"] };
var Ids = { "roomId": msg["roomId"] };
dbo.collection("conversations").findOneAndUpdate(Ids,val,{ upsert: true },res) {
if (err) throw err;
var FullArray = res["value"]["userList"];
FullArray.forEach(element => {
var someString = element;
someString["collectionName"] = "conversations";
MemberList(someString);
});
});
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] },{ limit: 1 }).sort({ $natural: -1 }).toArray(function (err,result) {
if (err) throw err;
result.forEach(element => {
io.emit(msg["roomId"],element);
});
//db.close;
});
});
//});
});
//-- add user to database -----///
socket.broadcast.on('createUser',function (msg) {
console.log("createUser");
//MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "userId": msg["userId"],"title": msg["title"] }).toArray(function (err,result) {
console.log(result);
if (result.length == 0) {
dbo.collection(msg["collectionName"]).insertOne(msg,converRes) {
console.log(converRes);
//db.close;
});
}
else {
//db.close;
}
});
//});
});
// -------- create Room ----///
socket.broadcast.on('createRoom',function (msg) {
//console.log("createRoom");
// MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
var dataObject = msg["data"];
var roomid = dataObject["roomId"];
dbo.collection(msg["collectionName"]).find({ "roomId": roomid }).toArray(function (err,result) {
if (result.length == 0) {
dbo.collection(msg["collectionName"]).insertOne(msg["data"],converRes) {
// console.log(converRes["insertedId"]);
io.emit('roomId',converRes["insertedId"]);
//db.close;
});
}
else {
//db.close;
}
});
// });
});
//---- get member list --////
socket.on('getChatUserList',function (msg) {
MemberList(msg);
});
function MemberList(msg) {
//MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
if (err) throw err;
var nameTopost = msg["userId"] + "_" + msg["title"];
dbo.collection(msg["collectionName"]).find({ "userList.userId": msg["userId"],"userList.title": msg["title"] }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err,result) {
if (err) throw err;
var userIdlist = [];
result.forEach(element => {
var someObject = element["userList"];
someObject.forEach(obj => {
userIdlist.push(obj)
});
});
dbo.collection("users").find({ $or: userIdlist }).toArray(function (err,userData) {
//console.log(userData);
var someData = {
"RoomList": result,"userData": userData,};
//console.log(someData);
io.emit(nameTopost,someData);
//db.close;
});
});
// });
}
///----- get total message count ----/////
socket.on('getTotalCount',function (msg) {
getTotalCount(msg);
});
///----- set total message count ----/////
socket.on('setTotalCount',db) {
var dbo = db.db("Hitesh");
var val = { $set: msg };
var Ids = { "totalCountId": msg["totalCountId"] };
dbo.collection(msg["collectionName"]).findOneAndUpdate(Ids,res) {
getTotalCount(msg);
});
//});
});
function getTotalCount(msg) {
//MongoClient.connect(url,db) {
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "totalCountId": msg["totalCountId"] }).toArray(function (err,result) {
io.emit(msg["totalCountId"],result[0]);
//db.close;
});
//});
}
socket.on('getMessageCount',function (msg) {
getMessageCount(msg);
});
function getMessageCount(msg) {
// MongoClient.connect(url,db) {
if (err) throw err;
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).toArray(function (err,result) {
io.emit(msg["messageId"],result[0]);
//db.close;
});
// });
}
socket.on('setMessageCount',db) {
if (err) throw err;
var dbo = db.db("Hitesh");
var val = { $set: msg["data"] };
var Ids = { "roomId": msg["roomId"] };
dbo.collection(msg["collectionName"]).findOneAndUpdate(Ids,res) {
//db.close
getMessageCount(msg);
});
// });
});
});
});
http.listen(port,function () {
console.log('listening on *:' + port);
});
... ..... ... ... ... 我不确定是什么原因导致了此问题
解决方法
似乎您在每个新的套接字连接上都创建了一个新的mongo连接:
io.on('connection',function (socket) {
console.log("connected");
MongoClient.connect(url,{ useUnifiedTopology: true },function (err,db) {
您应该创建一个连接并共享一个连接。我通常会创建与数据库的连接,然后然后启动HTTP和套接字服务器。
使用猫鼬的代码段,但概念相同–打开连接,然后设置服务器和处理程序:
mongoose.connect(`${config.db.uri}/${config.db.database}`,{useNewUrlParser: true,useUnifiedTopology: true,autoIndex: false});
const db = mongoose.connection;
db.once('open',() => {
const app = express();
app.db = db;
...
const http = require('http').createServer(app);
const io = require('socket.io')(http);
...
http.listen(config.server.port,() => {
console.log(`listening on ${config.server.port}`);
});
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。