Azure Web Apps はアーキテクチャ的にストレージがボトルネックになりがちですが、最近はコンテンツをローカルストレージにキャッシュする機能が追加されたり、徐々に改善の兆しがあります。
Local Cache は前に調べましたが、試した範囲では思ったより効果が出ませんでした*1。それとは別に Dynamic Cache という機能が追加されているみたいなので、こっちを試してみました。
いつものように、ひっそりと GitHub の Wiki に項目が追加されています。
Turning on the 'dynamic cache' feature.
Full content caching:WEBSITE_DYNAMIC_CACHE=1Directory metadata caching:
WEBSITE_DYNAMIC_CACHE=2Configurable settings · projectkudu/kudu Wiki · GitHub
ちゃんとした Dynamic Cache の解説が Azure Blog で公開されるまでは、正直なところ仕組みがどうなってるかよくわかりませんが、Directory metadata caching という表現は非常に気になるポイントです。
いつものようにポータルからキーを追加すると Dynamic Cache が有効になります。
仕組みはともかくとして、利用可能になっているので 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 = 0 | Dynamic Cache = 1 | Dynamic Cache = 2 | |
---|---|---|---|
Total time | 5.51s | 4.14s (75.1%) | 3.99s (72.4%) |
Avg time | 108.09ms | 81.35ms (75.3%) | 78.19ms (72.3%) |
Median time | 105.56ms | 78.61ms (74.5%) | 77.00ms (72.9%) |
99th percentile time | 96.91ms | 69.04ms (71.2%) | 69.97ms (72.2%) |
Slowest time | 160.00ms | 137.00ms (85.6%) | 103.00ms (64.4%) |
とはいえお約束ですが、有効にしただけで間違いなく効果が出るようなものではないでしょうし、そういったものであればデフォルトで有効になるはずです。あと、あくまでもキャッシュということをお忘れなく。
Local Cache の時のようにスロットを用意して、スワップしていく運用にしないと問題になりそうです。
*1:ローカルストレージが HDD なのが影響している気がします。