Varnishが採用している実装技術

VarnishはSquidのようなHTTPプロキシキャッシュサーバではなく、アクセラレーションを目的としたHTTPアクセラレータ。もともとVarnishを実装する以前には、Squidの採用が検討されていたが、次のような理由から適切なソリューションではないと判断し、同プロダクトの開発に踏み切ったとしている。

  • Squidはデータを主記憶メモリとハードディスクの間でやりとりするので動作が遅い

  • Squidは仮想メモリシステムをそれほど活用できていない

実装にあたってはHTTPアクセラレーションだけを目的とすること、より良い設定を実現すること、管理しやすいように実装すること、高速に動作することを目的として掲げている。プロキシキャッシュを目指したものではないというところに特徴がある。

実装には動作を高速化するための多くのテクニックが組み込まれている。まず基本的にI/Oが発生しないように組むこと、不要な処理はしないこと、同じ処理をするにあたってより処理時間の短い関数や処理を採用すること、仮想メモリシステムをフルに活用するようにプログラムを組むこと、カーネルの処理を活用しカーネルが提供する機能と衝突するような組み方をしないことなどが挙げられている。

細かい話になるが、例えばstrlen(3)の処理は軽いものではないので、かわりにmemcpy(3)を使うといったことも挙げられている。処理するデータの長さを先に書いておいて、いちいち長さをはからないようにすることも効果がある。

SquidとVarnishのベンチマーク結果も発表されたが、かなりの効果が見込めるものであることは間違いなさそうだ。

SquidとVarnishのベンチマーク

サーバ管理者/運用者も開発者も注目

Varnishはサーバ管理者/運用者にとっても開発者にとっても注目に値するものだ。既存のシステムに新たに導入する際にもそれほど手を加える必要はない。したがって、これまではスケールアップで対応していたようなケースでも、ハードウェアを追加する代わりにVarnishを導入するという方法で対処できる。また、ハードウェアを追加するとしても、Varnishを採用するとしないとでは追加する台数が違ってくるとみられる。

開発者はVarnishを高速化プログラミングの参照実装として活用してほしい。Varnishで採用されている実装はOSの性能をフルに引き出すという点できわめて興味深い実装になっている(FreeBSD 6/Linux 2.6対象)。カーネルデベロッパが開発したこともあってほかには見られない特徴が多い。Webサービスを提供している関係者は同アプリケーションの調査を検討してほしい。