socket.ioでxhr-pollingのコネクションが詰まる件(解決
※2012/01/09 追記
続きもあるよ
あらすじ
先月晴れてsocket.ioクラスタがデビュー。
しかし想定していたよりxhr-polling接続が多くてフガフガな状況に。
こりゃxhr-pollingの性能評価もしとくべきだったなーと思いを馳せるアルパカ。
そこでsocket.io-clientでベンチマークを走らせたのだが
websocketと時と異なりコネクションがすぐに詰まるという自体が発生…!
アルパカ大明神の運命やいかに!?
調査
様々なクライアントから実行しても同様の状況が見られたため
サーバの問題と断定しサーバ調べる。
しかしコード追ったりトレース取ったりしてもまったく原因わからず…><
神の声
そんなときまたしても神の声が!
socket.ioのxhr-polling、同一アプリケーションから接続すると5コネクションくらいで詰まるのなんなんだろう。めっちゃベンチしづらいんだけど
@toritori0318 同一ホストに対する同時接続数の、ブラウザの上限ですかねー?
あー、そうだそうだクライアント制限もあったんだった。なぜそっちを疑わなかった…!
Firefoxで制限を解除する方法
URL欄で「about:config」を入力しコンフィグ呼び出し。
検索窓で「network.http.max-persistent-connections-per-server」を入力し設定値を変えればおk!
Chromeで制限を解除する方法
軽く調べたけどわからなかった><
socket.io-clientで制限を解除する方法
元のコード
これでアタックかけると5connectionで止まる。
var io = require('socket.io-client') , connected = 0 , host = 'localhost:3000' , users = 100 , rampUpTime = 100 function user() { var socket = io.connect('http://' + host, {'force new connection': true, transports: ["xhr-polling"] }); socket.on('connect', function() { console.log('\t - connected: %s connections', ++connected); }); }; for(var i=0; i<users; i++) { //user(); setTimeout(function() { user(); }, i * rampUpTime); };
修正後のコード
socket.io-clientをロードする前にhttpのmaxSocketsを設定すればおk!
var http = require('http').globalAgent.maxSockets = 100; var io = require('socket.io-client') ...
思い込み(・A・)イクナイ!
maxSocketsも知ってはいたんですが今回は完全に
「サーバが原因」と思い込んでいてすっかりハマってしまいましたね…
あとブラウザでのクライアントの同一ホストソケット問題、実はいままで
「1HTML内での接続制限」と思ってたんですが実際は
「アプリケーション(同一プロセス?)内」での接続制限だったんですね。知らなかった。
よくよく考えたらそりゃそうだよなー、という感じ。
とにかくsugyanさんの神の声がなければ数日悩んでたかもしれないです。
sugyan++