鍵に国と言語の2つを足しただけで、当たり率が95.2%から31.0%に落ちました。
鍵の種類が800から115,200へ、144倍に増えたためです。掛け算で増えます。
鍵に足す見出しは掛け算で効きます。入れ物に収まらなくなった時点で、当たり率が崩れます。
Vercelでは、鍵に足す見出しを絞るよう勧められています。公式は足す見出しはよく選ぶこと。1つ増えるごとに、手前に置く項目の数が指数的に増えるからであると述べています。
どこで崩れるのか。見出しを1つずつ足して実際に数えてみました。
要求 400,000件・道筋 800種。手前の入れ物は 20,000件ぶん 鍵に足す見出しを1つずつ増やして、鍵の種類と当たり率を見る 足した見出し 鍵の種類 入れ物に収まるか 当たった割合 元へ取りに行った回数 (なし) 800種 収まる 99.8% 800回 国 19,200種 収まる 95.2% 19,200回 国+言語 115,200種 収まらない 31.0% 275,829回 国+言語+端末の種類 345,600種 収まらない 14.3% 342,749回 国+言語+端末の種類+利用者の区分 2,764,800種 収まらない 2.5% 390,111回
国だけなら95.2%を保ちます。19,200種は20,000件の入れ物に収まるからです。
言語を足した瞬間に31.0%へ落ちます。収まらなくなった時点で崩れます。
1つ目の見出しでは4.6ポイントしか落ちません。2つ目で64.2ポイント落ちました。
だんだん悪くなるのではなく、入れ物に入るかどうかで切り替わります。数える順番は、見出しの値の種類を掛け算するだけです。
拠点ごとに分かれる話はAmazon CloudFrontの記事で扱っていて、そちらと合わせると分母がさらに増えます。
収まらなくなった時点で、当たり率が一気に落ちる。
Use Vary headers selectively, as each additional header exponentially increases the number of cache entries.原文Vercel ドキュメント「Vercel CDN Cache」 この内容の有効期限2027-02-18
よく使われるものほど残ります。期限を同じにしても、頻度で結果が分かれます。
Vercelでは、よく求められるものほど残りやすくなります。公式はある資産がよく求められるなら、それは期間を通じて生き残る見込みが高いと述べています。
頻度でどれだけ分かれるのか。期限を揃えて実際に流して数えました。
1週間ぶん(168時間)・要求 2,246,000件。手前の入れ物は 5,000件ぶん 期限は 24時間に設定してあるが、入れ物がいっぱいになれば期限前でも押し出される 要求の頻度 件数 要求回数 当たった回数 当たった割合 1分に1回 200件 2,016,000回 2,014,600回 99.9% 1時間に1回 1,000件 168,000回 161,000回 95.8% 1日に1回 6,000件 42,000回 14,282回 34.0% 1週間に1回 20,000件 20,000回 0回 0.0%
期限はどの行も同じ24時間です。それでも99.9%から0.0%まで分かれました。
週に1回しか求められないものは、次に来るときには期限を超えています。手前に置く意味がありません。
この4つを合わせると、全体では99%を超えます。件数の大半が1分に1回の側だからです。
それでも、週1のものを求める利用者は毎回待たされます。全体の数字だけを見ていると気づけません。
分けて見る必要があるという点は遅延監視の記事でも扱いました。
If an asset is requested often, it is more likely to live the entire duration.原文Vercel ドキュメント「Vercel CDN Cache」 この内容の有効期限2027-02-18
期限は保証ではありません。大きくして効くのは、押し出しで落ちていた分だけです。
Vercelの期限は、保証ではありません。公式は手前に置く時間の最大を設定できるが、その時間は最善の努力であって保証されるものではないと述べています。
では大きくすればどこまで効くのか。同じ実行の後半で確かめました。
入れ物の大きさを変えたときの、頻度ごとの当たり率 入れ物の大きさ 1分に1回 1時間に1回 1日に1回 1週間に1回 5,000件ぶん 99.9% 95.8% 34.0% 0.0% 10,000件ぶん 99.9% 95.8% 46.1% 0.0% 20,000件ぶん 99.9% 95.8% 46.1% 0.0% 30,000件ぶん 99.9% 95.8% 46.1% 0.0%
効いたのは1日に1回の列だけで、34.0%から46.1%に上がりました。
しかも10,000件で頭打ちです。それ以上大きくしても変わりません。押し出しが起きなくなったからです。
週1の列が0.0%のままなのは2番目です。期限を延ばすほうを検討することになります。
2つの計測はいずれも手元で書いた模型で、実際のVercelを叩いたものではありません。入れ物の大きさや期限は置いた値で、実際の仕組みが同じ捨て方をしている保証はありません。要求の頻度も4つの型に分けて置いており、実際の分布とは違います。押し出しは、いちばん長く使われていないものから捨てる方式ひとつだけを試しました。ここで見せているのは、鍵に足す見出しは掛け算で効いて段差で崩れるという点と、当たらない理由が押し出しか期限切れかで打つ手が変わるという点の2つです。
While you can put the maximum time for server-side caching, cache times are best-effort and not guaranteed.原文Vercel ドキュメント「Vercel CDN Cache」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る