基本上我在我的公司项目中插入了一个JS代码,为一堆客户的网站提供内容.这段代码“ping”我的服务器每10秒调用一个图像并传递我在服务器端获得的参数并在MongoDb集合中插入(或更新).在一天的“慢”时间里,我得到大约3000个连接(我在终端上使用netstat -natp命令获得这些连接)每次使我的集群使用大约25%的每个核心(我使用“top”命令获得这些).但是在一个“忙碌”的时刻,我每次获得大约7000个连接,这使得我的集群变得疯狂(大约80%使用每个核心),并且随着时间的推移,节点似乎会降级.
这是正常的吗?或者Nodejs应该以更“简单”的方式处理这些命中?如果我使用Mongoose,性能会增加吗?
如果你对MongoDb很好奇,它使用了大约4%的一个核心,这对我来说很好(没有使用索引,使用率约为50%,但至少,索引解决了这个性能问题).
非常感谢耐心,
干杯.
编辑:
使插入的代码如下所示:
db.open(function(err,db){});
return connect.router(function(app){ app.get("/pingserver/:clientid/:event/:cachecontrol", function(req, res, next){ event:'+req.params.event + ', cachecontrol:' + req.params.cachecontrol); var timestamp = new Date(); switch(req.params.event) { case 'load': var params = url.parse(req.url, true).query; db.collection('clientsessions', function(err, collection) { try { var client = { id: req.params.clientid, state: req.params.event + 'ed', loadTime: timestamp.getTime(), lastEvent: req.params.event, lastEventTime: timestamp.getTime(), lastEventDate: timestamp.toString(), events: [{ event: req.params.event, timestamp: timestamp.getTime(), date: timestamp.toString() }], media: { id: params.media.split('|')[0] || null, title: unescape(params.media.split('|')[1]) || null }, project: { id: params.project.split('|')[0] || null, name: unescape(params.project.split('|')[1]) || null }, origin: req.headers['referer'] || req.headers['referrer'] || '', userAgent: req.headers['user-agent'] || null, userIp: req.socket && (req.socket.remoteAddress || (req.socket.socket && req.socket.socket.remoteAddress)), returningUser: false }; }catch(e) {console.log(e);} collection.insert(client, function(err, doc) { }); }); break; case 'ping': db.collection('clientsessions', function(err, collection) { collection.update({id: req.params.clientid}, { $set : { lastEvent: req.params.event ,lastEventTime: timestamp.getTime(),lastEventDate: timestamp.toString()} }, {}, function(err, doc) {}); }); break; default: db.collection('clientsessions', function(err, collection) { collection.update({id: req.params.clientid}, { $set : {state: req.params.event+'ed' , lastEvent: req.params.event , lastEventTime: timestamp.getTime()} , $push : { events : { event: req.params.event, timestamp: timestamp.getTime(), date: timestamp.toString() } } }, {}, function(err, doc) {}); }); break; } if (!transparent) { console.log('!transparent'); transparent = fs.readFileSync(__dirname + '/../../public/images/transparent.gif', 'binary'); } res.setHeader('Content-Type', 'image/gif'); res.setHeader('Content-Length', transparent.length); res.end(transparent, 'binary'); }); });
Is this normal?
取决于,他们自己的联系会消失吗?他们只是继续建设吗?你在谈论“网络连接”(http)或MongoDB连接?
mongod日志说什么?节点日志说什么?
你每秒收到多少请求?
Or should Nodejs handle these hits in a more “easy” way?
很难说不知道代码在做什么.
您期望盒子处理多少个同时连接?
If I use Mongoose, the performance can increase?
所以Mongoose实际上是一个围绕node-mongodb-native驱动程序的对象包装器.它不是一个不同的驱动程序,它只是一个包装器.
包装器将代码添加到您已有的代码中.如果您遇到代码问题,则无法保证添加代码可以更好地解决问题.如果mongoose确实解决了你的问题,那么它正在做一些与你不相关的事情.如果是这种情况,您不一定需要Mongoose,您只需要更好的连接管理.
看看你有很多潜在的问题来源.
解决问题的唯一方法就是打破碎片,深入挖掘细节.开始的地方:
– 正确关闭MongoDB的连接(查看数据库日志)?
– 日志是否包含任何其他错误?
– 为节点日志做同样的事情?
– 你有关于内存使用情况的图表吗?谁占用了最多的记忆?
– 当你达到每个核心的80%时,哪个进程正在执行此操作? mongod的?节点?别的什么?
为了真正帮助你,我们需要更多关于系统发生情况的数据.