Unicornの2倍!高速RackサーバRhebokのインターフェース解説 #rubykaigi 2015 #rubykaigiB

Rhebok, High Performance Rack Handler Masahiro Nagano @kazeburo http://rubykaigi.org/2015/presentations/kazeburo
1
今別府すてぃお @suthio_

ぼっちオペレーターTシャツほしい #rubykaigi

2015-12-12 16:15:06
黒曜@Leaner Technologies @kokuyouwind

Rhebokの作り方、のまえにRackの基礎。Rackはインターフェイス仕様の話と通常使われるRackの実装の2つの意味がある。今回は実装を置き換えるので、Rack Interfaceの方の話をする。 #rubykaigi #rubykaigiB

2015-12-12 16:15:46
Blue Garnet @blue_garnet_

Rack Web Interface Frameworkと動物園WebSrverをつなぎます #rubykaigi #rubykaigiB

2015-12-12 16:15:55
黒曜@Leaner Technologies @kokuyouwind

Rackの基本的な仕様はenvを受け取って配列を返すようなもの。envにはRequestDataのhashやCGI keyの他、Rackのspecific keyも含まれる。 #rubykaigi #rubykaigiB

2015-12-12 16:17:34
Yuya Takeyama @yuya_takeyama

Rack Application のステータス、文字列だったんだ... #rubykaigi

2015-12-12 16:18:50
黒曜@Leaner Technologies @kokuyouwind

ResponseはHTTP status code, header hash, bodyの3つ組配列。bodyはeachが実装されているもの。 #rubykaigi #rubykaigiB

2015-12-12 16:19:58
suginoy @suginoy

RackのResponseでヘッダで複数のcookie返すような場合は改行で区切るのか。知らなかった。 #rubykaigiB

2015-12-12 16:21:01
Blue Garnet @blue_garnet_

「たったこれだけでAppServerかけちゃう、ね?簡単でしょ?」 「ただしタイムアウトがないとか変なリクエストくると死ぬとかいろいろ問題がある」 #rubykaigi #rubykaigiB

2015-12-12 16:22:33
Kiyoshi Nomo 🐟☔️🍈🍋🍜 @kysnm

ネットワークつながらないなーと思ってたけど、Self-Assigned IP になってた… #rubykaigi

2015-12-12 16:22:38
黒曜@Leaner Technologies @kokuyouwind

Rack.Handlerの下にrun_serverを実装するような感じ。ただし普通に起動するだけだと、1プロセスなので遅い、タイムアウトなどがないので実用的ではない。 #rubykaigi #rubykaigiB

2015-12-12 16:22:51
黒曜@Leaner Technologies @kokuyouwind

高速化のために並列化する。Unicornはmulti process, PUMAはmulti thread + limited event model, Thinがevent model。 #rubykaigi #rubykaigiB

2015-12-12 16:23:48
さぼ ♻️ 春秋 @saboyutaka

#rubykaigiB ISUCONで勝ちに行くにはWebServer作ってパフォーマンスチューニング出来るレベルじゃないと無理そう

2015-12-12 16:24:56
Blue Garnet @blue_garnet_

Prefork アーキテクチャー rhebokのために作ったprefork_engineのgem kazuhoさんすごい #rubykaigi #rubykaigiB

2015-12-12 16:25:12
黒曜@Leaner Technologies @kokuyouwind

RhebokはPreforkなので、親プロセスがリクエストを待ち受けて、リクエストごとにワーカーを立ち上げて割り当てる。このためにprefork_engineを作った。 github.com/kazeburo/prefo… #rubykaigi #rubykaigiB

2015-12-12 16:25:26
Blue Garnet @blue_garnet_

性能が上がることがわかった。 次は安全に動く方向で頑張ろう #rubykaigi #rubykaigiB

2015-12-12 16:26:15
Blue Garnet @blue_garnet_

時間かかるなら、殺してしまえホトトギス #rubykaigi #rubykaigiB

2015-12-12 16:27:18
黒曜@Leaner Technologies @kokuyouwind

IO timeoutを入れる。実はUnicornにはIO Timeoutがない。デフォルトでは30秒でSIGKILLで殺される。これは残念なので、Rhebokではアプリに優しいタイムアウトにする。 #rubykaigi #rubykaigiB

2015-12-12 16:28:08
h3poteto @h3poteto@pleroma.io @h3_poteto

なんかよくわからなかったので全部Cで書いたww #rubykagi #rubykaigiB

2015-12-12 16:28:17
toshimaru @toshimaru_e

#rubykaigi kazebro さんの発表、めっちゃ勉強になるなー

2015-12-12 16:29:15
Blue Garnet @blue_garnet_

HTTP Serverは高速で効率的なものを・・・ PicoHTTPParser、またkazuhoさんですね! #rubykaigi #rubykaigiB

2015-12-12 16:29:45
Yuya Takeyama @yuya_takeyama

kazuho さんの過去の仕事が振り返られる便利な発表だ #rubykaigiB

2015-12-12 16:30:23
黒曜@Leaner Technologies @kokuyouwind

HTTP Parserはバグがあるとセキュリティリスクになるので慎重に。既存でMongrel, Node.jsなどがあるが、 PicoHTTPというのを作った。既存のものより1.3倍程度高速 #rubykaigi #rubykaigiB

2015-12-12 16:30:23
Blue Garnet @blue_garnet_

picoだとヘッダー数が少ないほど速い、10個あっても3割くらいunicoenより速い #rubykaigi #rubykaigiB

2015-12-12 16:30:31