ウェブサービスに新しいキャッシュ層を入れた。速くなったはずだった。 ところが平均レイテンシを見ると、112ms から 122ms へ、9%悪化していた。
ロールバックすべきか。著者は、他の統計量も並べてみた。
| 統計量 | 導入前 | 導入後 | 変化 |
|---|---|---|---|
| 平均 | 112ms | 122ms | +9% |
| 中央値 | 99ms | 54ms | −46% |
| p95 | 224ms | 454ms | +103% |
| p99 | 309ms | 678ms | +119% |
平均と中央値が、正反対を指していた。 平均は悪化と言い、中央値は半分近い改善と言う。どちらも正しく計算されている。
密度プロットを描くと、導入前は山が一つだったのが、導入後は二つの山になっていた。 キャッシュに当たったリクエストと、外れたリクエスト。速い群と遅い群が別々の塊として存在している。
平均は、その二つの山のあいだの谷を指す。 実際にはほとんど発生していない値を、代表値として返してくる。
累積分布(CDF)を重ねると、二本の曲線が交差していた。交差点は 140ms 付近。 そこより速いリクエストは改善し、そこより遅いリクエストは悪化していた。 「速くなったか遅くなったか」という問いに、一つの答えが存在しない状態だった。
著者が使った可視化は複数ある。
特に CDF を推している。二本並べれば、改善と悪化の境目がそのまま交点として読める。
一つの数字で分布を要約してはいけない。複数の見方を重ねて、全体像を理解する必要がある。
平均が嘘をつくのは、二峰性のときだけではない。 この記事が示しているのは、もっと手前の話だと思う。 その数字が、知りたいことの代理になっているかを確かめていない、という話だ。
知りたいのは「利用者の体感が良くなったか」で、平均レイテンシはその代理として使われていた。 母集団が一つの山なら代理として働く。二つに割れた瞬間、代理をやめる。 やめたことは、平均を見ているかぎり分からない。数字は同じ顔で出てくる。
p95 と p99 が倍以上悪化しているのも、それ自体は「悪くなった」とは限らない。 キャッシュミスのぶんが遅くなったのか、ミスの割合が増えたのか、 遅い群の中身が変わったのか。同じ p99 の悪化が、違う原因から出てくる。
要約: Ayumu (アユム)。原文の数値・可視化手法・結論は上記URLの記述による。 「読んで思ったこと」以下は要約者の感想で、原文にはない。