Create a gist now

Instantly share code, notes, and snippets.

@chikuwait /wsa.md Secret
Last active Dec 20, 2017

Embed
What would you like to do?
第一回 Web System Architecture 研究会 予稿

HTTPサーバとベアメタルハイパーバイザの協調による高速なレスポンス実現の構想

背景

 Webシステムにユーザからのリクエストが殺到すると,パフォーマンスのトラブルが生じることがある。トラブルは,リクエストが受け付けられない,応答速度の低下といった現象として表れる。この対策として水平方向の改善として計算機の追加同時接続数の改善などを行うか、垂直方向の改善を行ないWebシステムのパフォーマンスを向上させるなどの対策が必要がある。そこで垂直方向の改善としてHTTPサーバのレスポンスを高速にするコンテンツキャッシュという技術がある。画像やhtmlなどの静的なコンテンツを1回目のリクエストでHTTPサーバがキャッシュすることで2回目以降のリクエストを高速化することができる。しかし、静的なコンテンツに対して動的なコンテンツは内容が変動しキャッシュすることは非常に難しく、コンテンツキャッシュされることは少ない。また、動的なコンテンツをキャッシュしようとあるリクエストに対する応答を静的にキャッシュしてしまうとキャッシュの肥大化や変更が反映されない場合がある。

提案

この提案ではゲストOS上のHTTPサーバと同様のものを準パススルー型ベアメタルハイパーバイザに組み込み、ゲストOS上のHTTPサーバとベアメタルハイパーバイザのHTTPサーバが協調・連携することで高速なレスポンスの実現かつキャッシュの肥大化を防ぐことを目指す。

実現手法

1.概要

軽量ベアメタルハイパーバイザ”BitVisor”にプログラミング言語"mruby"の処理系を移植した"mruby in BitVisor"をベースにHTTPサーバを組み込む。mruby in BitVisorに組み込んだHTTPサーバはNICと直接データのやり取りを行ない、キャッシュのレスポンスを高速化する。OSカーネルより下のmruby in BitVisorでキャッシュを扱うことでOSカーネルによるオーバヘッドを軽減する。また、本提案では画像やhtmlといった静的コンテンツのみをキャッシュするのではなく、コンテンツを生成するスクリプトと静的コンテンツのゲストOS上のHTTPサーバから2回目のリクエスト以降に送信して2つのHTTPサーバが協調することでコンテンツキャッシュの肥大化と変更が反映されないのを防ぐ。また、ゲスト上のHTTPサーバが高負荷状態にある時は一部の処理をmruby in BitVisorに移譲することで負荷の分散を図る。本来、ゲストOSからmruby in BitVisorの存在を認知することはできないが、この構想ではあえてゲストOS・mruby in BitVisorどちらのHTTPサーバもお互いが居ることを認知して動作することで高速なレスポンスを実現する。

2.使用するHTTPサーバの検討

今回使用するHTTPサーバはゲストOS上だけでなく、ハイパーバイザ内でも動作させるため、移植性の高いHTTPサーバを選定する必要がある。mruby in BitVisorにはmrubyの処理系が移植してあるため、mrubyスクリプトで今回はmrubyで設定を記述することができるHTTPサーバが望ましい。そこで今回はmruby製のTrusterd HTTP/2 Web Serverを使用する。

3.準パススルー型ベアメタルハイパーバイザによるオーバヘッドの軽減

通常、オペレーティングシステムとハードウェアの間にベアメタルハイパーバイザを追加するとオーバヘッドが大きくなる。これはベアメタルハイパーバイザが全てのハードウェアを仮想化してゲストOS見せているからである。そのため、ハイパーバイザが無い状態に比べてオーバヘッドが大きくなり性能が低下する。しかし、準パススルー型では殆どのデバイスを直接見せ、処理を施したいハードウェアのみを仮想化する。そのため通常のハイパーバイザに比べてオーバヘッドを軽減することができる。また、今回mruby in BitVisorではNICがとCPUを仮想化することでmruby in BitVisorに組み込むTrusterdに専用のCPUコアを提供し、mruby in BitVisor内で直接NICとデータの送受信を行うようにするため、トータルのオーバヘッドはゲストOS上のTrusterdに比べて減少すると考える。

4.ベアメタルハイパーバイザとゲストOSの連携

動的にコンテンツ生成スクリプトと静的コンテンツの送信を行うにはゲストOSとベアメタルハイパーバイザの連携が不可欠である。この機構はmruby in BitVisorで実現する。mruby in BitVisorにはmrubyのスクリプトを用いてBitVisorに処理を追加する仕組みとゲストOS上からmrubyスクリプトを用いてBitVisorとインタラクションできる機能が存在する。この2つの機構を組み合わせることでゲストOSから動的にBitVisorの処理を記述したmrubyスクリプトを読み込ませることで可能にする。

まとめ

動的なコンテンツをキャッシュしようとあるリクエストに対する応答を静的にキャッシュしてしまうとキャッシュの肥大化や変更が反映されない場合がある。この問題に対して、ゲストOS上のHTTPサーバと同様のものを準パススルー型ベアメタルハイパーバイザに組み込み、本来ゲストOSから見ることができないハイパーバイザーのHTTPサーバとゲストOS上のHTTPサーバが協調・連携して高速かつキャッシュの肥大化を防ぐ仕組みを提案した。また、この仕組みはOSカーネルを経由せず高速にキャッシュコンテンツの送信を行う。これに加え静的コンテンツをキャッシュするのではなく、コンテンツを生成するスクリプトと静的コンテンツの2つをキャッシュすることで高速化と肥大化対策の両方を目指していく。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment