2015-06-30 123 views
2

我需要基準多個套接字連接。我有這個下面的代碼服務器的NodeJS:通過1000個連接的套接字IO無限循環

var io = require('./lib/node_modules/socket.io').listen(12345) 

io.sockets.on("connect", function(socket) { 
    console.log("Socket " + socket.id + " connected.") 

    socket.on("disconnect", function() { 
     console.log("Socket " + socket.id +" disconnected.") 
    }) 
}) 

和客戶端的NodeJS:

var port   = 12345 
, nbSocket  = 1000 
, io    = require("./lib/node_modules/socket.io-client") 

for (var i = 1;i <= nbSocket;i++) 
{ 
    var socket = io.connect("http://<<my_ip>>:" + port, {forceNew: true}) 
} 

當被執行客戶端代碼,服務器連接正確,插座和正常結束。

但是,如果我們將nbSocket更改爲2000,服務器永遠不會結束連接和斷開套接字。

我們已經嘗試與改變限制:

ulimit -n5000 

但它並沒有奏效。是否有另一個限制或我們錯過了什麼?

+0

「連接和斷開連接」是什麼意思?是否顯示消息「Socket 已斷開連接」?因爲,從我在代碼中看到的情況來看,沒有理由讓套接字斷開連接,除非您停止了客戶端腳本。 –

回答

1

我在運行Node v0.12.4和socket.io v1.3.5的OSX上進行了測試,它開始導致我在nbSocket=5000附近出現問題。

嘗試追加這個片段到你的服務器腳本的末尾:

process.on('uncaughtException', function(err) { 
    console.info(util.inspect(err, {colors: true})); 
}); 

另外,我改變了你的代碼一點點,並添加一個計時器,每秒打印兩次開放套接字的數量:

var 
    util = require('util'), 
    io = require('socket.io').listen(12345); 

var 
    clientCount = 0; 

function onClientDisconnect() { 
    clientCount--; 
} 

io.on('connect', function(socket) { 
    clientCount++; 
    socket.on('disconnect', onClientDisconnect); 
}); 

console.info('Listening...'); 

setInterval(function() { 
    console.info('Number of open sockets: %d', clientCount); 
}, 500); 

process.on('uncaughtException', function(err) { 
    console.info(util.inspect(err, {colors: true})); 
}); 

當開放套接字的數量開始接近5000,我開始看到這2條消息幾次:

{ [Error: accept ENFILE] code: 'ENFILE', errno: 'ENFILE', syscall: 'accept' } 
{ [Error: accept EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'accept' } 

libc manual

  • ENFILE:當前進程已打開的文件太多

所以其實我的問題是限制:在整個系統

  • EMFILE太多不同的文件開口的文件描述符,所以通過將上面的代碼片段添加到服務器腳本來檢查它是否也是您的問題。如果出現異常,您應該調查如何properly increase the limit of open files in your system

  • +0

    我們修改** ulimit **和** sysctl **作爲您的鏈接建議,我們完成了我們的節點命令啓動器,如下所述:[http://www.jayway.com/2015/04/13/600k-concurrent-websocket -connections-上使用節點-JS AWS-/(http://www.jayway.com/2015/04/13/600k-concurrent-websocket-connections-on-aws-using-node-js/) –