node.js应用程序突然将CPU加载到100%并挂起

我在linux虚拟机上运行的node.js上有简单的应用。 它侦听tcp消息并使用socket.io库将它们发送给客户端。 经过一段时间的低CPU使用率之后,它突然开始加载CPU,直到应用程序挂起。 脚本很简单,我不明白它有什么问题。

var net = require('net'); var io = require('socket.io').listen(socketPort); net.createServer(function (socket) { socket.setEncoding("utf8"); socket.on('data', function (dataStr) { console.log("TCP dataStr " + dataStr); var data = JSON.parse(dataStr); io.sockets.in(data.room).emit('publish', data); }); }).listen(tcpPort); io.sockets.on('connection', function (socket) { socket.on('subscribe', function (room) { console.log('subscribe room ' + room); if (Array.isArray(room)) { var i; for (i = 0; i < room.length; i++) { console.log('subscribe join room ' + room[i]); socket.join(room[i]); } } else if (typeof room === 'string') { console.log('subscribe join room ' + room); socket.join(room); } }); socket.on('unsubscribe', function (room) { console.log('unsubscribe room ' + room); if (Array.isArray(room)) { var i; for (i = 0; i < room.length; i++) { console.log('unsubscribe leave room ' + room[i]); socket.leave(room[i]); } } else if (typeof room === 'string') { console.log('unsubscribe leave room ' + room); socket.leave(room); } }); }); 

同样在集群模块中,我尝试运行多个与客户端进行通信的工作人员。 每个工作人员经过一段时间之后,在一分钟内以100%的时间差悬挂着自己的CPU核心。

UPD:客户端代码(在浏览器中运行):

  socketObj = new function() { var that = this; that.socket; that.init = function(nodeServerUrl, rooms, onPublishFunc) { that.socket = io.connect(nodeServerUrl); that.socket.emit('subscribe', rooms); that.socket.on('publish', function(data) { onPublishFunc(data); }); }; that.subscribe = function(room) { that.socket.emit('subscribe', room); }; that.unsubscribe = function(room) { that.socket.emit('unsubscribe', room); }; } ... try { socketObj.init('application url', ["room1", "room2"], nodeJsCallback); } catch(err) { } ... nodeJsCallback = function(jsonData) { //Only updates data on UI, no subscribing, unsubscribing, emitting etc. ... } 

UPD2:我试图重现在生产机器上和我的本地Windows机器上进行综合testing的问题。 我做了一些压力testing:

  1. 多个客户套接字连接
  2. 多个静态数据下载(浏览器的socket.io脚本)
  3. 增加了tcp更新的频率。

经过几个小时的testing,我没有重现。 但是当它用真实的用户进行生产时,它早晚挂起。

我开始认为这是环境或特定的消息问题。 可能接下来的事情我会尝试的是:

  1. 将Node.js更新为当前版本
  2. 尝试logging所有数据传输,稍后重播,希望能够重现

将Nodejs从版本v0.10.4(稳定)更改为v0.11.2(不稳定)。 所有这些都很好,消耗1-2%的CPU。 现在我们正在testingv0.10.8(稳定)。

UPD在v0.10.8应用程序也是稳定的。

即使这个问题在v0.10.4(稳定)上消失了,它仍然是非常奇怪和令人沮丧的。