2008.12.29 hello, world via Varnish マイコミジャーナルの記事を読んでたら「Pascal編」の文字をすっとばし て「VCL編」と誤読したという。ずっと Varnish 漬だったせいで疲れてる らしい。 SEE ALSO: http://journal.mycom.co.jp/column/helloworld/023/ 【コラム】Hello Worldコレクション 第23回 C言語とは違う、独自のプログラミング作法をマスターする - Pascal編 まぁ VCL(Varnish Configuration Language) はある意味 C 言語風であ りながら, 独特なプログラミング作法を持つ言語ということで…。と胡 麻化しつつ, VCL で hello, World を実装してみる。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub vcl_recv { error 200; } sub vcl_error { set obj.http.Content-Type = "text/plain; charset=iso8859-1"; synthetic {"hello, world "}; deliver; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 実は最小で記述するなら下記のように書けなくもないが, HTTP Status が 200 hello, world (つまりレスポンスヘッダの最初が「HTTP/1.1 200 hello, world」)となって, ボディが「200 hello, world」なタイトルの XHTML が get できるという。 ちょっとあんまり感があるので, 上記のような野暮ったい書き方にしておく。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub vcl_recv { error 200 "hello, world"; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 実行にあたってはダミーのバックエンドを指定する必要がある。ダミー なので, 実際にバックエンドが稼働している必要はない:-)。 バックエンドの指定方法としては varnishd コマンドに -b オプション を指定する方法とバックエンド宣言子(default バックエンドオブジェ クト)を指定する方法がある。両方指定してもいいが, 後者>前者で解釈 される。 ■ varnishd のオプションでバックエンドを指定する場合 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - varnishd -b localhost:10080 ... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ■ バックエンド宣言子によるバックエンドオブジェクトで指定する場合 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - backend default { .host = "127.0.0.1"; .port = "10080"; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - もちろん, ロードバランシングのための記述方法やら, フェイルオーバ ーしたい場合の記述方法とか, なぜ default なのかとか, 色々ツッコミ どころがあるが, 今回の目的から逸脱してるので, いつの日か…。。 ここでの確認(表示)方法は HTTP アクセス(ブラウザ等を使用)となる。 ■実行例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ telnet localhost http GET / HTTP/1.0 Host: localhost HTTP/1.1 200 OK Server: Varnish Retry-After: 0 Status: 200 Content-Type: text/plain; charset=iso8859-1 Content-Length: 13 Date: Sat, 27 Dec 2008 00:00:00 GMT X-Varnish: 183546381 Age: 0 Via: 1.1 varnish Connection: close hello, world - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - これはこれでウケたけど, 性能について興味を持ったので, ついでに 調べてみる。計測ツールとして ab (Apache HTTP server benchmarking tool) を使用した(ab についての罠は後述)。 ■ ab の実行例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ ab -q -c並列度 -t10 http://localhost/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 並列度を 1, 5, 10, 50, 100, 500, 1000, 1500, 2000〜10000 とし 10 秒 間計測した(並列度選定の理由は後述)。 並列度| 1| 5| 10| 50| 100| 500| 1000| 1500| 2000| 3000| 4000| 5000| 6000| 7000| 8000| 9000|10000| ------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 取得数| 2507| 2518| 2518| 2494| 2454| 2394| 2324| 2234| 2180| 2059| 1919| 1824| 1691| 1636| 1511| 1486| 1472| 転送量| 261| 262| 262| 259| 255| 249| 242| 232| 227| 214| 200| 190| 176| 170| 157| 155| 153| 取得数 [Hit/秒] 転送量 [Kbps] (ヘッダを含まないボディ - 13バイト/Hit - の転送量 bit/s) こうして見ると, だいたい 2500 Hit/秒あたりがピークで, 上位 1 割 (250 Hit/秒)をピークとして見た場合, 1 〜 1500 並列度でフラット な性能が出ていることが確認できる。 いわばトルク重視の広々パワーバンドのモンスターエンジンと言ったと ころか(IMFM)。 何度が試験してみて思ったのは, 並列度 1000〜2000 の間で落ち込みが 発生している点で, 中間値の 1500 を取るようにした(もっと細かく取っ ても面白みがなかった)。1000 より少ない並列度で細かく取っていたの だが, 傾向が変わらなかったのでこちらも省略した。 10000 より多く取ってない理由はリソースリミット(ファイルディスク リプタ数/プロセス)によるもの。varnish, ab ともに調整入れないとい けないなど, 調整が面倒だったので OS ディフォルト値のままにしたた めである(実運用環境ではもちろん Performance 調整を行っておく必要 がある)。 SEE ALSO: http://varnish.projects.linpro.no/wiki/Performance 転送量(帯域)が極めて小さいように見えるが, 13 バイト× 2500 回/秒 = 32500 バイト/秒= 260 Kbps である。このボディサイズだとヘッダ の影響度が大きく, 実際の転送量はこの 19 倍(247 バイト)となる。そ れでも 4.94Mbps 程度なわけだが。。 おそらく平均的なコンテンツを 10KB 程度と目算した場合の帯域は, さらに 41.5 倍して, 140.1Mbps 程度いけるものと思われる(あれ? サ イズと Hit/秒 との相関は? > たぶんページサイズ毎に階段状に相関 すると思われ)。 調査していた時の CPU 使用率を見た限りだと, だいたい下記の傾向が 見られた(CPU は Pentium M 1.20GHz)。 35% varnishd 30% OS 30% net サブシステムのソフトウェア割り込み処理({swi1: net}) 5% ab Varnish が本気で仕事する(?)と OS と net サブシステムが大きく関わ ってくることがわかる。とりあえず, 3 者間(varnishd, OS, net swi) のコンテキストスイッチが激しいだろうことを予想して, vmstat(8) の cs 項(Context Switch)を眺めてみてたところ, 平常時(?) 500〜3000 回/秒くらいのところが, 70000〜90000 回/秒まで上がってる。 そこで比較のため Athlon X2 QL-60 1.90GHz で検証したところ(UP で), 下記の結果が得られた。 並列度| 1| 5| 10| 50| 100| 500| 1000| 1500| 2000| 3000| 4000| 5000| 6000| 7000| 8000| 9000|10000| ------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 取得数| 4589| 4583| 4515| 4418| 4403| 4372| 4234| 4125| 4003| 3790| 3533| 3317| 3032| 3056| 2764| 2414| 2331| 転送量| 477| 477| 470| 459| 458| 455| 440| 429| 416| 394| 367| 345| 315| 318| 287| 251| 242| 取得数 [Hit/秒] 転送量 [Kbps] (ヘッダを含まないボディ - 13バイト/Hit - の転送量 bit/s) CPU (だけじゃないけど)性能向上による恩恵は受けてるようだ。またや はり, CPU 使用率はそれほど大きくは変わらず(±5%程度の傾向の違い はあるが), コンテキストスイッチが 200〜1500 回/秒だったのが 90000 〜100000 回/秒まで跳ね上がってる(後半で瞬間 60000 程度まで下がっ てるのが見られる時があるが…)。 Varnish を本気にさせたいなら, 如何に多くコンテキストスイッチさせ るかが鍵になる(なんか違う)。 そこで SMP の結果を…と行きたいところだが, SMP では ab は結果を 出してくれないらしい(T_T)。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ ab .... apr_socket_recv: Connection reset by peer (54) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ab が当てにならんとは聞いてたけど, このあたりに問題があったとは …。実は最初は http_load で調べていたが, 何度繰り返してもフラッ トな結果が得られたので, 怪しいなと思ってソースを読んだところ, 10 並列以上コネクションを張らないという。 orz というわけで, 参考値として。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ echo http://localhost/ | http_load -parallel 10 -seconds 10 /dev/stdin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +------------------------+-------+-------------+--------+---------+ |CPU 名 | CPU数 | Hit/秒 | P-M 比 | A-X2 比 | +------------------------+-------+-------------+--------+---------+ |Pentium M 1.20GHz | 1 | 3468 Hit/秒 | 1.0 倍 | - | |Athlon X2 QL-60 1.90GHz | 1 | 4929 Hit/秒 | 1.4 倍 | 1.0 倍 | |Athlon X2 QL-60 1.90GHz | 2 | 7915 Hit/秒 | 2.3 倍 | 1.6 倍 | +------------------------+-------+-------------+--------+---------+ ん〜。Dual Core にして 1.6 倍改善するなら Quad Core なら 4.1 倍 (1.6 の 3 乗)期待していいのかな:-)。 とりあえず Varnish のバケモノっぷりはご覧の通りということで。ま ぁ観測されるべきサーバー上で観測するプログラムを実行するとか, localhost (INET ドメイン)で通信しているとか, 観測環境が一定して いないだとか, 折り返し返答についての性能はわかったけどキャッシュ 応答の場合の性能はどうだとか, 色々とツッコミどころはあるけど, とりあえず, ついでのはずの性能評価が 3 日もかかって疲れたのでこ の辺でやめておく。 参考 厳密には色々あるが, 日々の作業範疇で覚えてしまってるので, あんま り何かを見て検証していない。後日 Varnish についてスポットを当て た時にでも紹介ということで。 Written by 重村法克