命中率要看权重
读缓存通过把热数据留在更快的一层(内存、固态层、控制器缓存)来减少落地读,因此命中率与读性能直接相关。但命中率本身有口径问题:按请求数统计与按字节数统计的结论可能相反。大量小请求命中、少数大请求未命中时,请求命中率很高而字节命中率很低,实际读带宽仍然被后端拖住。评估缓存效果必须同时看请求命中率、字节命中率与回源读的时延。
基本信息
| 缓存层级 | 应用缓存、主机内存、存储控制器缓存、分层固态层 |
|---|---|
| 统计口径 | 请求命中率与字节命中率,两者需分开看 |
| 关联指标 | 未命中请求的时延与吞吐、缓存逐出速率 |
| 影响因素 | 工作集大小、访问随机性、数据变更频率 |
| 易被忽略 | 缓存污染与顺序读冲刷 |
典型使用场景
- 读多写少的业务:判断缓存能否带来主要收益
- 命中率上升但业务未变快:确认是否只是小请求命中
- 周期性变慢:缓存被批量任务冲刷后重新预热导致
- 分层存储调优:判断热数据是否真的留在快速层
- 容量评估:用工作集大小推算所需缓存规模
缓存效果验证思路
缓存效果验证思路
# 1) 先量工作集:一段时间内被读取的对象总量与重复度
# 2) 分别统计请求命中率与字节命中率,两者差距大说明口径在误导
# 3) 看未命中请求时延:真正影响感受的是这部分请求
# 4) 检查逐出与回填速率:频繁逐出说明缓存容量不足
# 5) 识别冲刷源:大顺序读与批量扫描是否绕过缓存
# 6) 结论:命中率提升必须能换算为可测量的业务时延下降缓存现象判读
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 请求命中率高但带宽不变 | 命中的是小请求,大请求仍在落盘 | 改看字节命中率,对读大的路径单独优化 |
| 命中率随时间周期性下降 | 被批量任务冲刷 | 把大顺序读设为绕过缓存或错峰执行 |
| 命中率高但时延高 | 命中的层级本身慢或排队 | 检查缓存层资源与并发 |
| 命中率长期偏低 | 工作集大于缓存容量 | 扩容缓存或重设热点策略 |
| 写入后读变慢 | 缓存失效与回填带来额外开销 | 评估回填策略与写入模式 |
缓存只提升读路径:写入性能取决于介质写能力、写缓存策略与写放大,命中率再高也不会改变这一点。
命中率是手段不是目标:缓存收益最终要落在未命中请求的时延与回源带宽上。这两项没有改善时,命中率再高也不代表用户变快了。