「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。comments以前のエントリ「mrubyでSPDYやHTTP2通信」で、mrubyを使ってHTTP/2通信を行うクライアントを作りましたが、機能が最低限でした。そこで、今回はmrubyで簡単なHTTP/2のサーバを動かせるようにしてみました。mruby-http2の導入mrubyでHTTP/2を動かすには、mrubyのbuild_config.rbにmruby-http2の行を追加してrakeするだけで簡単に導入できます。'matsumoto-r/mruby-http2'endその後にmrubyのディレクトリ内で、rakeを実行すると、HTTP/2のサーバとクライアント機能を持ったmrubyバイナリが出来上がります。mrubyでHTTP/2サーバを動かすでは、実際にmrubyでHTTP/2サーバを動かしてみましょう。安定性と性能を重視してコア部分を実装したので機能は少ないですが、そこそこの安定性と性能が得られたので今後は各種Webサーバ関連の設定機能を追加していきたいと思っています。サーバは以下のように書くだけです。true,})s.runこのように書いて、mrubyバイナリでプログラムを実行するとHTTP/2サーバが起動します。http2_server.rb上記で指定したドキュメントルートにコンテンツを置きます。今回は以下のようなindex.htmlを作りました。world.mrubyで書いたHTTP/2クライアントでアクセスする次は、上記で起動させたHTTP/2サーバに対して、同様にmrubyで書いたHTTP/2クライアントでアクセスしてみましょう。クライアントは以下のように書きます。r.stream_idそして、mrubyバイナリでこのプログラムを実行すると以下のようにレスポンスが返って来ます。world.¥n"251きちんとレスポンスが返って来ますね。続いて、クライアント側で各frameの処理フェーズでblockをコールバックしてみましょう。以下のように書きます。r.response今回は単純に各frameやsessionの処理フェーズでフェーズ名を出力するだけにしました。:stream_id=>1}このように各フェーズでコールバックされている事がわかります。今後はこのコールバック時に、内部の処理から値を取ってきたり、値を設定したりできるようにしようと考えています。同様の機能はより必要になってくるサーバにも実装する予定です。HTTP/2のテストサイトとして、https://http2.matsumoto-r.jp:58080/index.htmlに上記のmrubyで書いたHTTP/2サーバを起動させていますので、クライアントだけ試したい人などは是非活用してみてください。簡単なベンチマークサーバの機能を実装したということで、ベンチマークをかけてみてどの程度の安定性と性能が出るのかを簡単に見てみたいと思います。検証環境はVM上でCPU2コアでメモリ8GBです。いってもVM環境なのでピンとこないということで、この環境でnginxを動かした場合の性能との相対比較をしてみようと思います。processを1で動かしました。いうのも、mruby-http2で動かすサーバはマルチworkerには対応していないため、シングルworkerで比較してみたかったからです。mruby-http2で動かしたTLS有りと無しのHTTP/2サーバには、h2loadによって同時接続数100、1セッション当たりの並行ストリーム数100、総接続数10万でベンチマークをかけました。worldレベルのテキストです。以下、nginxの設定です。html;}}}シングルworkerなのでaccept_mutex等の設定は省いています。ベンチマーク結果です。42929このように、nginxよりもmruby-http2で書いたTLS有りのHTTP/2サーバの方がこの条件下においては性能が出ました。TLSを使っていない場合は297178req/secと軽量なファイルだと非常に性能がでました。この辺りの実験ログは引き続き行いgistにも結果をいくつか上げているので御覧ください。早すぎるので追試して頂けると非常に嬉しいです。それなりに同時接続数を増やしたり大量にアクセスしても今の所落ちたりしていないので安定性も最低限あるように思います。Valgrindのメモリリーク等もありませんでした。(実はここに至るまでには並行でリクエストをかけると落ちてしまうバグに悩まされて1日以上かけてそのバグを取り除いたのですが...)まとめ以上のように、mrubyで書いたHTTP/2サーバでもそれなりの性能と安定性が得られる事が分かりました。mruby-http2のコアのベース実装はこのような実装にしておいて、今後は各種設定機能を追加していきたいと思っています。等を地道にやっていこうと思います。それにしても、HTTP/2の難しい所をライブラリとして提供してくれているnghttp2は本当に素晴らしいです。Commentコメントを投稿するにはログインしてください。