Unicornの2倍!高速RackサーバRhebokのインターフェース解説 #rubykaigi 2015 #rubykaigiB
Rhebokの作り方、のまえにRackの基礎。Rackはインターフェイス仕様の話と通常使われるRackの実装の2つの意味がある。今回は実装を置き換えるので、Rack Interfaceの方の話をする。 #rubykaigi #rubykaigiB
2015-12-12 16:15:46Rack Web Interface Frameworkと動物園WebSrverをつなぎます #rubykaigi #rubykaigiB
2015-12-12 16:15:55Rackの基本的な仕様はenvを受け取って配列を返すようなもの。envにはRequestDataのhashやCGI keyの他、Rackのspecific keyも含まれる。 #rubykaigi #rubykaigiB
2015-12-12 16:17:34ResponseはHTTP status code, header hash, bodyの3つ組配列。bodyはeachが実装されているもの。 #rubykaigi #rubykaigiB
2015-12-12 16:19:58RackのResponseでヘッダで複数のcookie返すような場合は改行で区切るのか。知らなかった。 #rubykaigiB
2015-12-12 16:21:01「たったこれだけでAppServerかけちゃう、ね?簡単でしょ?」 「ただしタイムアウトがないとか変なリクエストくると死ぬとかいろいろ問題がある」 #rubykaigi #rubykaigiB
2015-12-12 16:22:33ネットワークつながらないなーと思ってたけど、Self-Assigned IP になってた… #rubykaigi
2015-12-12 16:22:38Rack.Handlerの下にrun_serverを実装するような感じ。ただし普通に起動するだけだと、1プロセスなので遅い、タイムアウトなどがないので実用的ではない。 #rubykaigi #rubykaigiB
2015-12-12 16:22:51高速化のために並列化する。Unicornはmulti process, PUMAはmulti thread + limited event model, Thinがevent model。 #rubykaigi #rubykaigiB
2015-12-12 16:23:48#rubykaigiB ISUCONで勝ちに行くにはWebServer作ってパフォーマンスチューニング出来るレベルじゃないと無理そう
2015-12-12 16:24:56Prefork アーキテクチャー rhebokのために作ったprefork_engineのgem kazuhoさんすごい #rubykaigi #rubykaigiB
2015-12-12 16:25:12RhebokはPreforkなので、親プロセスがリクエストを待ち受けて、リクエストごとにワーカーを立ち上げて割り当てる。このためにprefork_engineを作った。 github.com/kazeburo/prefo… #rubykaigi #rubykaigiB
2015-12-12 16:25:26IO timeoutを入れる。実はUnicornにはIO Timeoutがない。デフォルトでは30秒でSIGKILLで殺される。これは残念なので、Rhebokではアプリに優しいタイムアウトにする。 #rubykaigi #rubykaigiB
2015-12-12 16:28:08なんかよくわからなかったので全部Cで書いたww #rubykagi #rubykaigiB
2015-12-12 16:28:17HTTP Serverは高速で効率的なものを・・・ PicoHTTPParser、またkazuhoさんですね! #rubykaigi #rubykaigiB
2015-12-12 16:29:45HTTP Parserはバグがあるとセキュリティリスクになるので慎重に。既存でMongrel, Node.jsなどがあるが、 PicoHTTPというのを作った。既存のものより1.3倍程度高速 #rubykaigi #rubykaigiB
2015-12-12 16:30:23picoだとヘッダー数が少ないほど速い、10個あっても3割くらいunicoenより速い #rubykaigi #rubykaigiB
2015-12-12 16:30:31