EventMachineの速度が安定しない[解決]

Posted filed under PhotoShare.

Photo by the_amanda  PhotoShareをRailsから、EventMachineベースの自作フレームワークに全面書き換えをしているのですが、大体作り終わりベンチマークを取っていると、概ね1msで処理しているのに、時々、数百ms掛かることがありました。  初めはGCとか疑ったんですが、GC.disable実行しても状況変わらず。絞り込みをしていると、どうもEventMachineで詰まって居るっぽい。  EC2上で動かしていたので、手元のマシンで試したり、LinuxじゃなくてFreeBSDで試しても同じように詰まる。同じEventMachineを使っているThinを使って、ベンチマーク取ってみても、100回に1回ぐらい、やたらレスポンスが遅い時間があるのを確認できました。  ApacheBenchやhttperfは、平均値は取れるけど、個別のレスポンスタイムを出力する方法が見つからなかったので、JMeterに初挑戦。HTTPだけじゃなくて、いろいろなプロトコルに対応しているのがいいね。  色々試してみると、HTTPに限らずTCPソケットサーバを作ると発生するらしく、こんなコードでも、1000回に1,2回、接続した後1000ms近く待たされることがあることが分かりました。  MLとか探しても、同じような現象の話が出てきていない・・・。探し方が悪いのか、じつは誰もあまりまじめに使ってないのか・・・・。  ここら辺まで原因がつかめたところで、takiuchi先生にご相談。  結局カーネルまで追って、変にselectを呼び出して居ることが判明。takiuchi先生さすが! 自分もカーネルとか追うように色々準備しておかないと駄目だなと反省。  このコードを元に検索してみると、迷ったりしていることは分かったけど、このパッチを当てると、接続が詰まる状況が改善。  ここ以外にも、微妙なコードが見られるので、引き続きコードを追ってみよう。  年末の忙しい時期なのに、手伝ってくれてありがとうございました!>takiuchi先生