history

青木日記 RSS

<前の日 | この月 | 次の日>

2004-05-19

fcgi.rb

[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 (2)

オリジナルの 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)

fcgi.rb (3)

だめだやっぱり徹夜はだめだ、 こんなところで 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)

fcgi.rb

昨日の fcgi.rb のパッチではだめだった。 他のところもいじらないといけないようだ。 間違っている可能性としてはこんなところかな。

  • pack/unpack のテンプレート
  • eof? を使わないようにする

だめだ、これを変えても直らない。 すっぱりあきらめよう。

気になる人はリライトしたほうも試してみてください。 BitChannel ではこっちを CVS に入れちゃいました。

(03:51)

ruby-dev summary

しまったー、すっかり ruby-dev summary のことを忘れてた。 スキップが続くのはよくないなあ……。

(04:24)

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS