コンピューターサイエンス入門:理論編
キャッシュヒット率
この回でやること
ヒットとミスの記録を読み解き、ヒット率と未計測の扱いを確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
キャッシュを入れたら速くなった気がする、では次の判断ができません。置ける量を増やすのか、寿命を延ばすのか、そもそもキーの作り方が悪いのか。変更する前に、いま効いているかどうかを数字にします。
当たりと外れを合わせて数える
キャッシュは、一度取ってきたものを手元に置く仕組みです。次に同じものを求められたとき、手元にあればそれを返します。これがヒットです。手元に無く、元の保存先へ取りに行くのがミスです。全アクセスのうちヒットした割合をヒット率と呼びます。
分母はヒット数だけではありません。ヒット数とミス数を足した、全アクセス数です。ヒット数をその合計で割り、100を掛けるとパーセントになります。
プレーンテキスト
ヒット率 = ヒット数 ÷ (ヒット数 + ミス数) × 100CPUの中のキャッシュ、ブラウザの画像の控え、CDNの配信、DBの問い合わせ結果にも、この考え方を使えます。ただし比較するときは、どの層を測ったかと、集計した期間をそろえます。昨日の累計と今日の1時間分をそのまま比べても、変更の効果は判断できません。
分母が0になる日がある
まだ一度もアクセスが来ていなければ、合計は0です。ヒットもミスも観測していないので、割合は計算できません。デプロイ直後や、まだ使われていない機能では普通に起こる状態です。
JavaScript
console.log(0 / 0); // NaN
console.log(NaN === NaN); // falseNaN は数として計算できない結果を表します。自分自身と比べても等しくならず、画面の数字に紛れ込むと扱いに困ります。アクセスが0件なら、割り算の前に「未計測」として別に表示します。
ヒット率が高くても遅いことがある
ヒット率だけでは応答時間を判断できません。外れたときの処理が重ければ、少数のミスが待ち時間の大半を占めます。応答時間や、元データへのアクセス数と並べて見る必要があります。
数字が下がったら、置ける量が足りない、すぐ捨てられる、同じ内容でもキーが違う、といった原因を調べます。キーはデータを探すための名前です。Redisの INFO stats にはヒットとミスの回数が出るので、同じ期間の増分から割合を確かめられます。
例題で確かめる
画像配信の記録で、ヒットが90回、ミスが30回でした。総アクセスは 90 + 30 = 120回 です。ヒット率は 90 ÷ 120 × 100 = 75% になります。
90 ÷ 30 = 3 はヒットとミスの比で、全体に占める割合ではありません。この期間は4回に3回が手元の控えで済み、残る1回は元へ取りに行った、と読み取れます。