零、本文背景
一个接口的关键指标应该就是响应速度,要想提高响应速度,结果在缓存中最好;
那么怎么确定一个合理的缓存时间,以平衡性能与成本呢?
我们可以通过记录业务请求,看读取缓存的时间分布,比如 99% 的请求都是 1天内;
近期在做日志分析,找到比较理想的一个缓存过期时间,使 90% 的查询都能被缓存覆盖;
发现有些同学不太懂 TP 指标,故写文记录一下。
一、性能指标含义
常见指标:TP50、TP80、TP90、TP99、TP999
正式解释:TP=Top Percentile,Top百分数,是一个统计学术语,与平均数、中位数都是一类;
通俗理解:TP99 100ms,99%的查询都能在100ms内返回;
本质理解:它是一个分位值,看数据的一个分布;
二、性能指标计算
计算方式:拿到所有请求耗时,升序排序,取 99% 位置的数据,就是 TP99;
比如说:拿 100 次请求的耗时,升序排序,取第 99 个的数据,就是TP99的值;
具体的代码方式就是,先算出耗时,放入 List ,然后排序,按指定的下标取值即可;
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private void calTime(List<Long> timeDurations) { timeDurations.sort(Long::compareTo); double tp50 = timeDurations.size() * 0.5; double tp90 = timeDurations.size() * 0.9; double tp99 = timeDurations.size() * 0.99; double tp999 = timeDurations.size() * 0.999;
DoubleSummaryStatistics doubleSummaryStatistics = timeDurations.stream().mapToDouble(Long::longValue).summaryStatistics(); System.out.println(JSON.toJSONString(doubleSummaryStatistics));
System.out.println("tp50:" + timeDurations.get((int) Math.ceil(tp50))); System.out.println("tp90:" + timeDurations.get((int) Math.ceil(tp90))); System.out.println("tp99:" + timeDurations.get((int) Math.ceil(tp99))); System.out.println("tp999:" + timeDurations.get((int) Math.ceil(tp999))); }
|