読者です 読者をやめる 読者になる 読者になる

アルパカDiary Pro

はてなブログProではありません

socket.ioでxhr-pollingのコネクションが詰まる件(解決

Node.js

※2012/01/09 追記
続きもあるよ

あらすじ

先月晴れてsocket.ioクラスタがデビュー。
しかし想定していたよりxhr-polling接続が多くてフガフガな状況に。
こりゃxhr-pollingの性能評価もしとくべきだったなーと思いを馳せるアルパカ。
そこでsocket.io-clientでベンチマークを走らせたのだが
websocketと時と異なりコネクションがすぐに詰まるという自体が発生…!
アルパカ大明神の運命やいかに!?

現象

socket.io-clientでxhr-pollingのコネクション貼りまくると5コネクションで詰まる。
時間が経つとその内ヌルッと進む。
chromefirefoxでも同様。

調査

様々なクライアントから実行しても同様の状況が見られたため
サーバの問題と断定しサーバ調べる。
しかしコード追ったりトレース取ったりしてもまったく原因わからず…><

神の声

そんなときまたしても神の声が!

あー、そうだそうだクライアント制限もあったんだった。なぜそっちを疑わなかった…!

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')

...


わーい!\(^o^)/

思い込み(・A・)イクナイ!

maxSocketsも知ってはいたんですが今回は完全に
「サーバが原因」と思い込んでいてすっかりハマってしまいましたね…
あとブラウザでのクライアントの同一ホストソケット問題、実はいままで
「1HTML内での接続制限」と思ってたんですが実際は
「アプリケーション(同一プロセス?)内」での接続制限だったんですね。知らなかった。
よくよく考えたらそりゃそうだよなー、という感じ。


とにかくsugyanさんの神の声がなければ数日悩んでたかもしれないです。
sugyan++