私はnode.js/socket.ioを初めて使用しており、多くの同時永続接続に耐える必要のあるパフォーマンスソケットサーバーを構築しようとしています。限界をテストするために、私は10kウェブソケットを作成するクライアントを構築しましたが、私は何の問題も経験しません。しかし、この数を20kに増やすと問題が発生します。サーバーとクライアントは同じマシン上で実行されています(Windows 10)。socket.ioとの同時接続が多い
私が経験しています問題:
私は私のクライアントのために、次のエラーメッセージを取得16kの同時接続超えたら:
engine.io-クライアント:ソケットソケットエラー を{」タイプ: "TransportError"、 "description":{"code": "ENOBUFS"、 "errno": "ENOBUFS"、 "syscall": "connect"、 "address": "127.0.0.1"、 "port" 5433、 "タイプ": "エラー"、 "ターゲット":{"ドメイン":null、 "_イベント":{}、 "_イベントカウント":4、 "_ソケット":null、 "_ ultron":null、 "_ closeReceived" false、 "bytesReceived":0、 "readyState":0、 "supports":{"binary":true}、 "extensions":{}、 "_ "false"、 "url": "ws://127.0.0.1:5433/socket.io /?EIO = 3 & transport = websocket"、 "protocolVersion":13、 "binaryType": "buffer"}}} + 0msと
私はこの問題を解決するには、次の試してみました:
- followwingノードstartparameterを使用してノードproccessために利用可能なRAMを増やす:
--max-old-space-size=8192
- クラスタリング(複数のクライアントプロセス)
注:
- これらのアプリケーションを実行しているマシンは、16ギガバイトのRAMを持っています。両方のアプリケーションが動作している場合、8GBのRAMは無料です。
- サーバーは特定のソケット接続数を超えるとソケット接続を失います(私が思うようにpingタイムアウトが発生するため)。
- CPUはすべてのソケットを作成するときに100%にスパイクします。それ以外の場合は、25%CPUで「アイドリング」します。
私はクライアントのために使用していますコード:
var helper=require("./helpers/helper.js");
function log(text){
console.log("[CLIENT] " + text);
}
var blocked = require("blocked");
blocked(function(ms){
console.log("[WARNING] Last client tick took " + ms + "ms!! Clients may not react fast enough....");
}, {threshold: 150});
function createClient(){
var socket = require('socket.io-client')('http://127.0.0.1:5433', {transports:['websocket']});
socket.on('response', function (data) {
console.log("server:" + JSON.stringify(data));
});
socket.on('sessionCheckResponse', function (data) {
//console.log("server:" + JSON.stringify(data));
});
socket.connect();
setInterval(function() {
socket.emit("sessionCheck", "aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc");
}, 2500);
}
for(var i=0; i<17000; i++)
createClient();
クライアントが16k接続を行う必要がある理由を説明してもらえますか? –
16kはまだ動作する限界です。クライアントはStressへの16k接続をシミュレートするだけでサーバをテストします。プロダクションでは、私は50-100kの接続を保守する必要があります(しかし、より良いハードウェアで) – kentor
しかし、あなたはクライアントでエラーを取得していませんか?なぜなら、あなたはクライアントに対してストレステストをしているように見えるからです。 forループで17kを作成するのではなく、タイムアウトで新しい接続を作成してみてください –