[ruby-talk:99910] Pure Ruby FastCGI performance bug?
「pure Ruby 版の fcgi ライブラリを使っている場合、 長いデータを送ると反応が妙に遅れることがある」らしい。 もしかしてこれって家の BitChannel で時々ピタッと止まるのと同じ現象かな。 なんだろうと思ってたんだよー。
……
調べるだけのつもりだったのに、 うっかり書き直してしまった……。
やっぱり止まるじゃん。だめじゃん。
とりあえず pack テンプレートの signed と unsigned を間違ってるだろう。
うううう、なんだこれは。 BasicSocket.for_fd を使うと次々にプロセスが増殖していく。 やっぱり Socket.for_fd でないとだめっぽい。
一回だけ accept してると思ってたのに、 実はセッションごとに回線がブチブチ切れていた。 ということは、むしろ積極的に close すべきなのか? あ、直った。
嘘だった。 連続でリクエストするとなぜか SEGV するようになった。 原因もわからず停止するよりはこっちのがマシか? いや、GC 関係なのでやっぱり嫌だ。
いや違う、また嘘。ruby が二週間も前のやつだった。 二週間前の HEAD なんて、食料で言えばとっくに賞味期限切れレベルである。
Ruby をアップデートしたらなおった! 10000 リクエスト連続でもへこたれない。すばらすい。
そんなわけで、リライトした fcgi.rb 置いておきます。
そういえば無意識のうちに Ruby 1.8 を仮定していたような気がするな。 HEAD までは必要ないはず。
(06:05)
オリジナルの fcgi.rb ならこんな感じでなおりそうな気がする。
--- fcgi.rb.org 2004-05-19 06:25:10.000000000 +0900 +++ fcgi.rb 2004-05-19 06:25:12.000000000 +0900 @@ -239,6 +239,8 @@ rescue LoadError end # type of request end # until @ns.eof return nil + ensure + @ns.close end # accept def close
起きたときに気が向いたらテストします……。
(06:29)
だめだやっぱり徹夜はだめだ、 こんなところで close してどうする。こうか。
--- fcgi.rb.org 2004-05-19 06:25:10.000000000 +0900 +++ fcgi.rb 2004-05-19 06:43:31.000000000 +0900 @@ -197,6 +197,7 @@ rescue LoadError def accept rec = Record.new if @ns.eof? + @ns.close @ns, = @server.accept end until @ns.eof?
本当に練る。もとい寝る。
(06:44)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.