我在linux虚拟机上运行node.js的简单应用程序。它监听tcp消息,并使用套接字将它们发送到客户端。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);
}
});
});
也与集群模块,我试图运行多个工作与客户端通信。一段时间后,每个worker将自己的CPU内核100%挂起,时间差约为一分钟。
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机器上用合成测试重现这个问题。我已经做了一些压力测试:
- 多个客户端套接字连接 多个静态数据下载(套接字。
- tcp更新频率增加。
经过几个小时的测试,我无法复制。但是当它在生产环境中与真正的用户一起运行时,它迟早会挂起。
我开始认为这要么是环境问题,要么是特定的消息问题。接下来我可能会尝试的是:
- 更新Node.js到当前版本
- 尝试记录所有数据传输并稍后重放,希望挂起会重现
将Nodejs从v0.10.4(稳定)版本更改为v0.11.2(不稳定)。到目前为止,所有工作都很好,消耗1-2%的CPU。现在我们正在测试v0.10.8(稳定版)。
UPD在v0.10.8上应用程序也很稳定
尽管这个问题在v0.10.4(稳定版)上消失了,但它仍然非常奇怪和令人沮丧。