6月 232010
 

以前書いた記事(VarnishでESIを使うときの注意するべき点)で

Keep-AliveはOFFにするべき

ESI使用時はcontent-lengthがブラウザ側に返却されないようなのでOFFはほぼ必須です
どうしても使いたい場合はESIを使用するときのみkeep-aliveをOFFに・・・

直Varnishはやめた方がいい

Keep-aliveをオフにしても特定のクライアント(ab/wgetなど)で接続が維持されて5秒ほど待ってしまうことがあります
つまりKeep-Aliveが有効かつcontent-lengthがないときの挙動と同じになります
じゃぁどうすればいいか?
自分はフロントにNginxを置いてそこからVarnishにproxyしています

と書きましたがどうやら2.1.X系では改善されたようです

ということで比較してみます
Continue reading »


5月 202010
 

Varnishのランタイムパラメータのデフォルト値を調べてまとめてみました
まだ情報は少ないですがちょくちょく追記していこうかなと思います

Varnishランタイムパラメータ

とりあえず2.1.xで使えなくなったのは
accept_fd_holdoff
acceptor
backend_http11
client_http11
obj_workspace
purge_hash
srcaddr_hash
srcaddr_ttl
ですね


5月 172010
 

現在Varnishは2.1.2までバージョンがあがっていますが2.0.xを使っている方も多いと思います

VCLの記法が変わったり同じパラメータで本番投入したら挙動が違うといったこともあるので注意が必要です
僕もまだ完全につかんでいませんがメモ程度に

vcl_fetchにおいてobj.*が使えなくなった

obj.*は使えなくなりましたberesp.*に置き換えればOKです

fetch;pass;などをreturnで囲まなくてはならなくなった

今まで補完してくれていたのでしょう
単にreturnで囲めばOKです
ex:pass; -> return(pass) ;

一部起動パラメータが使えなくなった

全部は把握してないのでそのうち調べて表にしますがたとえば
srcaddr_ttl
は使えなくなっています
最近ウノウラボさんが記事を出されていましたがあのパラメータだと起動しません
まとめました→Varnishのランタイムパラメータをまとめてみた(2.0.x-2.1.x間の比較)

メモリの使用の仕方がかなり変わった

僕はmallocで運用しているのですが今まで
-s malloc,2G
だとすると大体2Gぐらいしか使わなかったのですが
2.1.2は1.5~2倍ぐらい使います
おそらく調整する項目があるとは思うのですがまだつかみきれていません
それでヒット率が劇的に下がるということは今のところないので単に効率が悪くなったというわけではなさそうです

LAが高くなる

これはたぶん僕が適したパラメータを設定してないのだと思います
デフォルトパラメータで起動した場合キャッシュがあふれ出すあたりで約5倍というかLAが1前後で張り付きます
単純に5倍になったのかコアをひとつしか使ってないのかはちょっと調べてみようと思います
回避方法の記事です→Varnish2.1.2でLoadAverageが1ぐらいで張り付いてしまう問題の回避方法

これからいろいろ調べてみようかなと思っています
随時調べたらブログに上げようと思いますのでよろしくお願いします


4月 262010
 

とっても便利なVarnishですがいろいろできないことがあってたまになんとか出来ないかなーとか悩むことがあります
特に日付演算には弱い気がします。
以前紹介したESIでのTTLを強引な指定についても日付演算ができれば簡単に・・・と
ということでサンプル的に

  • アクセスされた時間をもとにExpiresを付与

をやってみたいと思います

Continue reading »


2月 202010
 

携帯コンテンツを作っているとドコモ・AU・ソフトバンクで表示可能サイズが違うため
同じURLで別々のコンテンツを出したいことが多々あります
それでもURLは同じなので単純にキャッシュしてしまうと同じコンテンツを返してしまいます
もちろん携帯に限った話ではなくてPCのブラウザのタイプによって・・・とかいろいろありますね
じゃぁどうすりゃいいのってことで解決方法です
Continue reading »


2月 202010
 

以下の記事でもチラッと書いたのですがVarnishの現バージョンではESIのTTL指定がesi:includeタグからできません

VarnishでESIを使うときの注意するべき点

単純に考えるのであればvcl_fetchでそれぞれのURLで指定すればいいとも言えるのですが
ESIの利点を多少損なっている感もします
(個人的にはデザイナ側がこのパーツは10分キャッシュしてもユーザに影響しないよ!とか設定できるのが利点と思ってる)
じゃぁどうすればいいのでしょうか
あまりスマートではないですが解決方法があります

例えばdocument root直下にあるhello.htmlを
ESIでincludeしたい場合で10秒のTTLを指定する時に


<esi:include src="/esi/t/10s/hello.html"></esi:include>

こんな感じの記述でできるようになります
Continue reading »


2月 172010
 

軽めのネタで
varnishでVCL(設定ファイル)を作っているとすごく分割したくなります
たとえばACL(アクセス制限まわり)などの定義を書いてみると非常に冗長になったりして困ります
なんか分割方法ないかなーと探してたらありました


include "インクルードしたいファイル名";

ええそのまんまです
公式サイトでも一応書いてはあるのですが

Syntax overview

The VCL syntax is very simple, and deliberately similar to C and Perl. Blocks are delimited by curly braces,statements end with semicolons, and comments may be written as in C, C++ or Perl according to your own preferences.

In addition to the C-like assignment (=), comparison (==) and boolean (!, && and ||) operators, VCL supports regular expression and ACL matching using the ~ operator.
Unlike C and Perl, the backslash (\) character has no special meaning in strings in VCL, which use the (%xx) escape mechanism just like URLs, so it can be freely used in regular expressions without doubling.
Assignments are introduced with the set keyword. There are no user-defined variables; values can only be assigned to variables attached to backend, request or document objects. Most of these are typed, and the values assigned to them must have a compatible unit suffix.
VCL has if tests, but no loops.
The contents of another VCL file may be inserted at any point in the code by using the include keyword followed by the name of the other file as a quoted string.

VCL – Varnish configuation Language
とあって書いてるのですが非英語圏だとさくっと読み飛ばしそうです><
こういう所も参考記述があると助かるんですがね・・・
自分も読み飛ばした口なので自戒も込めて共有です

参考サイト
Poul-Hennings other homepage


2月 152010
 

HTTPでの要求でIMS(if-modified-since)というものがあります
ようはこんな感じのやりとりです

ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
 (If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「最新だからそれ使ってもいいよ」
 (304 Not Modified)

普通であればまったく問題ないやり取りです
ただトラフィックが非常に大きいサーバの場合深刻な問題になります
さっきのやり取りをもうちょい具体的にかくと

ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
 (If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「ちょっとまってね(HDDのファイルの更新日時を調べる・・・)最新だからそれ使ってもいいよ」
 (304 Not Modified)

もしくは

ブラウザ「今この日付でオブジェクトもってるんだけどこれって最新?使ってもいい?」
 (If-Modified-Since: Sun,14 Feb 2010 03:01:19 GMT)
サーバ「ちょっとまってね(HDDのファイルの更新日時を調べる・・・)古いからこれ使って」
 (200 OK で実ファイル転送)

いらないioが発生してしまいます
ioといってもファイルの更新日時程度なので少々ならまったく問題ないのですが非常に多いとそれだけでiowaitが大変なことに・・・
304で実ファイルは転送されないため見かけ上のトラフィックはさほど発生せずiowaitが発生してなんだろう?と悩むこともあるかも?

5/29にちょこっと修正しました(vcl_error追加)
Continue reading »


2月 082010
 

あんまり話題に上らないで個人的に悔しいVarnishのESI(Edge Side Include)ですが
非常に癖がありますのではまりやすいポイントをとりあえず自分用のメモ程度に

2010/06/23追記:Ver2.1.2では多少注意事項が変わっていますのでこちらも参照ください
そもそもESIってなに?

例えばTwitterのホーム画面で考えてみましょう

ページは様々な要素で構成されていますが大きく分けて二つに分かれます

表示される度に更新しなくてはいけないもの(広告・タイムライン)
表示される度に更新しなくてもいいもの(フォロワーなどの数)

別にフォロワー数を表示するためにPHPを動かして、DBかmemcacheにアクセスして整形して・・・
といった処理をしてもいいのですが
PVが多いWEBサイトの場合、毎回呼ばれる処理はできるだけしたくありません
PHP→memcacheとしても負荷が結構痛いです
そういう時にESIがあると、ページの構成要素ごと キャッシュを行い、Varnish側で組み立てて返却してくれます
PHPやDBまでアクセスがこないので負荷に強くなるとともに、そのキャッシュした構成要素を別の画面で再利用できます

PC向けの場合Ajaxなどもあるので、一概にESIがすごく有効とも言い辛いのですが(例でTwを上げましたがちょっと悪かったかも)
携帯向けなどJSが使えない環境で、毎回一枚のHTMLを出力しないといけない場合非常に効果的です
また転送速度が上がるのでPVが上がるかも しれませんしSEOにも効果がありそうです
(Googleはどれぐらいでページが表示されるかをSEOの評価としてるみたいです)

Continue reading »