Varnishを使ってみる

仕事でHTTPアクセラレータであるVarnishを使ってみようぜ!ということになったので、使ってみた時のインストール手順とか感想などをメモ。ちなみにSquidとか使ったこともないです。絶対スキル不足だと思うんだが、よく転職できたな…俺。

感想

Varnishの動きを制御するVCLがわかりやすかったですが、ドキュメントが貧弱でネットで色々調べる必要がありました。
その中で一番詳しかったのは参考に書いてあるPDF。処理のフロー図やパラメータなど細かく書いてありました。この資料と常ににらめっこしながら検証してました。

導入までの経緯

元々、静的コンテンツにAWSのCloudFrontを使っていたのですが、ある国からアクセスした時にCloudFrontを使った時に速度が出なかったんですね。国外への回線が細い&ルーティングが変なところに行ってたのでこりゃダメだと。
代替のCDNサービスを探してみたのですがいいのが見つからなかったので、国内にVarnish立てて、キャッシュサーバとして使うかと。

構成(予定)

今のところ予定している構成は
クライアント ---> LB ---> varnish ---> S3
って感じを想定してます。
速度が出るところはこれまでどおり、クライアント ---> CloudFrontとなる予定です

インストール

インストールは簡単


wget http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz
tar xzf varnish-3.0.2.tar.gz
cd varnish-3.0.2
sh autogen.sh
./configure
make
sudo make install
OSの設定変更
データをメモリ上に持たせても、負荷をかけるとI/Owaitが上がるので、ファイル書き込みが行われるところをtmpfsにしてI/Owaitを減らします。
また、大量アクセスをさばくためにコネクション数などを変更します。あとここには書いてませんが、オープンできるファイル数なども変更してます。

mount -t tmpfs -o size=256m tmpfs /usr/local/var/varnish
vi /etc/fstab
tmpfs /usr/local/var/varnish tmpfs defaults,size=256m 0 0
cp -p /etc/sysctl.conf /etc/sysctl.conf.org
vi /etc/sysctl.conf
# 既存の設定があるのでコメントアウトする
# net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 3
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1

監視

Nagiosはプロセス監視とhit raitoの監視をしようと思いました。hit raitoのプラグインがいまいちいいのがなかったので自作しました。
Muninはこちらにほしいものがあったのですが、スレッドが作れなかった数や最大値に引っかかった数とかも欲しかったので、自作しました。

負荷をかけてみる

最初、OSの設定変更をしていなかったので、長い時間コネクションが開いたままで、性能がなかなか出なかったのですが、OS設定変更をしたらそこそこ性能が出るようになりました。
あとはJmeterがしょっちゅう落ちるので性能検証に時間がかかってしまいました。単体ファイルだとApacheBenchで負荷かけてました。
あと負荷かけてる横でpurgeコマンド叩いたらどうなるか?というのを検証しました。結果はvarnishlogで見るとアクセスは1アクセスしかないので、処理待ちしてるっぽい。ここがどん詰まりしなきゃいいけど…ちょっと心配だな。

後は実運用に入ってからもうちょっとまとめるか。

参考:
Varnishの使い方(Using Varnish)を和訳しました » cat /dev/random > /dev/null &
夏に出したVarnishCache入門をPDFで公開しました » cat /dev/random > /dev/null &
varnishについて|サイバーエージェント 公式エンジニアブログ
https://www.varnish-cache.org/trac/wiki/Performance