読者です 読者をやめる 読者になる 読者になる

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps に実装された Dynamic Cache の効果を大雑把に検証してみた

Azure Web Apps はアーキテクチャ的にストレージがボトルネックになりがちですが、最近はコンテンツをローカルストレージにキャッシュする機能が追加されたり、徐々に改善の兆しがあります。

Local Cache は前に調べましたが、試した範囲では思ったより効果が出ませんでした*1。それとは別に Dynamic Cache という機能が追加されているみたいなので、こっちを試してみました。

いつものように、ひっそりと GitHub の Wiki に項目が追加されています。

Turning on the 'dynamic cache' feature.
Full content caching:

WEBSITE_DYNAMIC_CACHE=1

Directory metadata caching:

WEBSITE_DYNAMIC_CACHE=2
Configurable settings · projectkudu/kudu Wiki · GitHub

ちゃんとした Dynamic Cache の解説が Azure Blog で公開されるまでは、正直なところ仕組みがどうなってるかよくわかりませんが、Directory metadata caching という表現は非常に気になるポイントです。

いつものようにポータルからキーを追加すると Dynamic Cache が有効になります。

f:id:shiba-yan:20161212005735p:plain

仕組みはともかくとして、利用可能になっているので WEBSITE_DYNAMIC_CACHE の値を 0/1/2 と変えて試してみました。go-wrk を使って Grav で作った shibayan.jp にリクエストを投げました。

go-wrk -c=1 -n=50 http://shibayan.jp/

接続数を増やすと php-cgi.exe が新しく立ち上がってしまって遅くなるので、1 つの接続だけ使うようにしました。結果は 20 回ほど実行して一番良い値を引っ張ってきました。

ひとまずそれぞれの設定での go-wrk の結果をそのまま貼ることにします。

WEBSITE_DYNAMIC_CACHE = 0

==========================BENCHMARK==========================
URL:                            http://shibayan.jp/

Used Connections:               1
Used Threads:                   1
Total number of calls:          50

===========================TIMINGS===========================
Total time passed:              5.51s
Avg time per request:           108.09ms
Requests per second:            9.07
Median time per request:        105.56ms
99th percentile time:           96.91ms
Slowest time for request:       160.00ms

=============================DATA=============================
Total response body sizes:              222500
Avg response body per request:          4450.00ms
Transfer rate per second:               40356.60 Byte/s (0.04 MByte/s)
==========================RESPONSES==========================
20X Responses:          50      (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)

WEBSITE_DYNAMIC_CACHE = 1

==========================BENCHMARK==========================
URL:                            http://shibayan.jp/

Used Connections:               1
Used Threads:                   1
Total number of calls:          50

===========================TIMINGS===========================
Total time passed:              4.14s
Avg time per request:           81.35ms
Requests per second:            12.06
Median time per request:        78.61ms
99th percentile time:           69.04ms
Slowest time for request:       137.00ms

=============================DATA=============================
Total response body sizes:              222500
Avg response body per request:          4450.00ms
Transfer rate per second:               53685.43 Byte/s (0.05 MByte/s)
==========================RESPONSES==========================
20X Responses:          50      (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)

WEBSITE_DYNAMIC_CACHE = 2

==========================BENCHMARK==========================
URL:                            http://shibayan.jp/

Used Connections:               1
Used Threads:                   1
Total number of calls:          50

===========================TIMINGS===========================
Total time passed:              3.99s
Avg time per request:           78.19ms
Requests per second:            12.54
Median time per request:        77.00ms
99th percentile time:           69.97ms
Slowest time for request:       103.00ms

=============================DATA=============================
Total response body sizes:              222500
Avg response body per request:          4450.00ms
Transfer rate per second:               55790.84 Byte/s (0.06 MByte/s)
==========================RESPONSES==========================
20X Responses:          50      (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)

集計結果

大雑把ですが Local Cache よりも分かりやすく効果が出た感じがします。PHP アプリケーションで試したので、WordPress を動かしている環境でも同様に効果が出るかもしれません。

Full content caching より Directory metadata caching の方が効果が高かったですが、アプリケーションの構造にも左右される部分だと思っています。

Dynamic Cache = 0Dynamic Cache = 1Dynamic Cache = 2
Total time5.51s4.14s (75.1%)3.99s (72.4%)
Avg time108.09ms81.35ms (75.3%)78.19ms (72.3%)
Median time105.56ms78.61ms (74.5%)77.00ms (72.9%)
99th percentile time96.91ms69.04ms (71.2%)69.97ms (72.2%)
Slowest time160.00ms137.00ms (85.6%)103.00ms (64.4%)

とはいえお約束ですが、有効にしただけで間違いなく効果が出るようなものではないでしょうし、そういったものであればデフォルトで有効になるはずです。あと、あくまでもキャッシュということをお忘れなく。

Local Cache の時のようにスロットを用意して、スワップしていく運用にしないと問題になりそうです。

*1:ローカルストレージが HDD なのが影響している気がします。