Skip to content

Instantly share code, notes, and snippets.

@mizzy
Forked from mala/gist:5002784
Created February 21, 2013 06:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mizzy/5002809 to your computer and use it in GitHub Desktop.
Save mizzy/5002809 to your computer and use it in GitHub Desktop.
このLEMONってのがrapgeniusの人ね。
http://cache.gyazo.com/91f2e906a220fbeef2e9283b0aee597a.png
Unicorn使っても2workerで動いているところに遅いリクエストが3件来たら詰まるよ!!
根本的な解決にならない!!
とか言ってるんですよ。
じゃあ例えば、並列数1x10と並列数2x5で遅いリクエスト5件投げてキューに詰まる確率を考えてみよう。
絵で表すとこう。絵じゃなくて文字だけど。
1 * 10 : |o|o|o|o|o|o|o|o|o|o|
2 * 5 : |oo|oo|oo|oo|oo|
1番目は10枠にボール5個投げて2個以上はいる確率を考える。いわゆる誕生日問題。
1 - ( (9/10) * (8/10) * (7/10) * (6/10) ) = 0.6976 で 70%ぐらい。
2番目は5枠に5個投げて、3個以上入る確率だ。計算するの面倒くさいな。
まあ1000回ぐらい試行しておけばいいだろ。
function sim(worker,server,request){
var total = 0;
var queued = 0;
for (var j=0;j<1000;j++){
total++
var box = new Array(server);
for (var i=0;i<server;i++){ box[i] = 0 }
for (var i=0;i<request;i++){ box[Math.floor( Math.random()*server) ]++ }
if (box.some(function(v){ return v > worker }) ) { queued++ }
}
return queued / total;
}
こんな感じ
sim(2,5,5) // 0.303
sim(2,10,5) // 0.0828
2worker * 5台で 30%。サーバー10台なら8%ぐらいになった。
並列数1なら確実に詰まる、けど、ホントに少数でも並列接続ができていれば、
「不幸にも」全部のworkerが遅いリクエストに当たってなければ別のリクエストを処理できる。
(いやしかし一般的にI/O待ちがボトルネックになり、その間CPUがスカスカになるWebアプリケーションで3,4workerは少ないのだけど)
トータルでのワーカーの数が同じでも、全部のworkerが「遅いリクエスト」に当たらなければ詰まらない。
処理時間にバラつきがある場合に、「複数同時リクエストが出来ない」サーバーを大量に立てる、よりも、
「少数でもいいから並列接続が出来る」サーバーを少数立てたほうが遙かにマシ。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment