ホーム > IIJ Technical WEEK 2012 ポスターセッション トップ > Haskell で実装した高速 Web サーバ Mighttpd

Haskell で実装した高速 Web サーバ Mighttpd

IIJ-II は、2007年から Mighttpd という独自のWeb サーバを実装し、オープンソースとして公開しています。Mighttpd には、コードを簡潔に保つアイディアや高速化の手法が盛り込まれています。この実装を通じて、よりよいネットワーク・プログラミング・モデルを考察し、提案していく予定です。

なぜ Haskell なのか?

Haskellでは、イベント駆動のランタイムの上に軽量スレッドが実装されており、プログラマが自由に利用できます。これまでユーザ空間でのスレッドは、さまざまな言語で提供されてきましたが、軽量でない、安全でないなどの理由から廃れてしまいました。Haskellは、純粋関数型言語であり、多くの計算が非破壊的です。この性質のおかげで、安全で軽量なユーザ空間のスレッドを提供することに成功しています。

サーバの実装を大まかに4つに分類し、図示したのが図1~4です。長所短所を以下の表にまとめます。


図1:ネイティブスレッド


図2:イベント駆動


図3:1コア1プロセスマッピング


図4:軽量スレッド

高速化の手法

1.システムコールの低減 :システムコールを発行するとCPU時間がカーネルに移り、すべての軽量スレッドが止まるので、システムコールの発行は極力抑えるべきです。Mighttpd では、open()、close()、stat() などの結果を安全にキャッシュします。静的ファイルが短時間内に繰り返し要求された場合、必要となるシステムコールは、recv()、send()、sendfile()のみです(図4)。

図4:Mighttpd の構成と発行するシステムコール

2.特化と計算の再利用 :Haskellの標準ライブラリには汎用だが遅い関数があります。例としては日付を整形する関数が挙げられます。

プロファイルを使って遅い関数を特定し、HTTP通信に特化した関数を再実装しています。また日付文字列などの計算結果は、可能な限り再利用し、無駄な計算を避けています。

3.ロックの低減 :不必要なロックはプログラミングの敵です。しかしランタイムやライブラリが気付かないところでロックを使っていることがあります。Haskellのイベントログと Linux の prof コマンドを組み合わせると、無駄なロックを発見できます(図5)。

図5:ロックによりセッションの1/10が消費されている例

Mighttpd では、CAS を用いて可能な限りロックを排除しています。

ページトップへ