[Varnish]URLごとにキャッシュの hit/miss を集計する。

varnish-logovarnishtop コマンドを使うと varnishtop -b -i TxURLvarnishtop -b -i RxURL とすれば、それぞれバックエンドサーバへのリクエスト(=cache miss)、Varnish へのリクエストの統計情報がわかる。
varnishtop は現状を把握する上では便利だけど、URLを 単位で cache hit/cache miss がどのくらいあったのかあとで集計したいときには使いづらい。

そこで varnishncsa を使ってリクエストごとのキャッシュヒットの有無をログ出力し、あとから URL ごとの cache hit/miss 数を集計できるようにしてみた。

varnishncsaを使ったキャッシュ情報の出力

リクエストごとのキャッシュヒットの有無をファイル cache_log.log に出力するには次のコマンドを実行する。

$ varnishncsa -F '%U%q %{Varnish:handling}x' -w cache.log

各オプションについて以下で説明。

ログ出力先ファイル

ログファイルに出力する場合は -w filename と指定する。
確認しやすいために今回はファイルに出力。プロダクションでは、標準出力経由で syslog 出力したほうが良い。

ログフォーマット

%{Varnish:handling}x がメイン。

  • cache hit の場合、hit
  • cache miss の場合、miss
  • pass/hit_for_pass の場合、pass
  • error の場合、-

が出力される。

なお pipe の場合は出力されない。

%{Varnish:handling}x とすると

  • cache hit の場合、hit
  • cache miss/pass/hit_for_pass の場合、miss
  • error の場合、-

が出力される。

また、残りのオプションについては

  • -F オプションでログフォーマットを指定できる。
  • %U はクエリーストリングを除いた URL
  • %q はクエリーストリング

varnishncsa の各オプションはマニュアルを参照

https://www.varnish-cache.org/docs/trunk/reference/varnishncsa.html

ログの集計

varnishncsa で出力したローデータ

$ cat cache.log
/ miss
/?foo=bar miss
/?foo=baz miss
/?foo=baz hit
/ hit
/404.html -
/404.html -
/ hit
/hit_for_pass.html pass
/ hit
/ hit
/ hit
/ hit
/ hit
/ hit
/ hit
/ hit
/ hit
/ hit
/pass.html pass
/pass.html pass
/nocache.html miss
/nocache.html miss
/nocache.html miss
/nocache.html miss
/404.html?foo=bar -

(URL, handling) で group by して件数を確認

$ sort cache.log | uniq -c | sort -nr
12 / hit
4 /nocache.html miss
2 /pass.html pass
2 /404.html -
1 / miss
1 /hit_for_pass.html pass
1 /?foo=baz miss
1 /?foo=baz hit
1 /?foo=bar miss
1 /404.html?foo=bar -

handling, 件数 の順にソートしたい場合

$ sort cache.log | uniq -c | sort -k 3,3 -k 1,1nr
2 /404.html -
1 /404.html?foo=bar -
12 / hit
1 /?foo=baz hit
4 /nocache.html miss
1 /?foo=bar miss
1 /?foo=baz miss
1 / miss
2 /pass.html pass
1 /hit_for_pass.html pass

検証用 VCL

pass, nocache, error などを用意した検証用 VCL は以下

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
     if (req.url ~ "404") {
         error 404 "Not Found.";
     } elseif (req.url ~ "pass") {
         return (pass);
     } else {
         set req.backend = default;
     }
}

sub vcl_fetch {
     if (req.url ~ "hit_for_pass") {
         return (hit_for_pass);
     }
     if (req.url ~ "nocache") {
         set beresp.ttl = 0s;
     }
     return (deliver);
}

sub vcl_pass {
    return (pass);
}

sub vcl_deliver {
    return (deliver);
}

References

Advertisements
Tagged with: ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: