百种弊病,皆从懒生

在 redshift 中计算 p95 latency

2018.10.12

p95 latency 的定义: 把一段时间的 latency 按照从小到大排序, 砍掉最高的 %5, 剩下最大的值就是 p95 latency. p99, p90 同理.

p95 latency 表示该时间段内 95% 的 reqeust 都比这个值快.

一般我直接看 CloudWatch, 和 datadog 算好的 p95 值. 这次看看怎么从 access log 里直接计算 p95 latency.

假设在 redshift 中有一张表存储了应用的 access log, 结构如下:

CREATE TABLE access_log (
    url         string,
    time        string,
    resp_time   real
);
url time resp_time
/test1 2018-10-11T00:10:00.418480Z 0.123
/test2 2018-10-11T00:12:00.512340Z 0.321

要算 p95 很简单, 把 log 按分钟数分组, 用 percentile_cont 在组内按 resp_time 排序计算 就能得到:

select date_trunc('minute', time::timestamp) as ts,
      percentile_cont(0.95) within group(order by resp_time) as p95
from access_log 
group by 1
order by 1;

得到:

     ts          |        p95
---------------------+-------------------
 2018-10-11 00:00:00 |  0.71904999999995
 2018-10-11 00:01:00 | 0.555550000000034
 2018-10-11 00:02:00 | 0.478999999999939
 2018-10-11 00:03:00 | 0.507250000000081
 2018-10-11 00:04:00 | 0.456000000000025
 2018-10-11 00:05:00 | 0.458999999999949
 2018-10-11 00:06:00 | 0.581000000000054
 2018-10-11 00:07:00 | 0.585099999999937
 2018-10-11 00:08:00 | 0.527999999999908
 2018-10-11 00:09:00 | 0.570999999999936
 2018-10-11 00:10:00 | 0.587950000000069
 2018-10-11 00:11:00 | 0.648900000000077
 2018-10-11 00:12:00 | 0.570000000000024
 2018-10-11 00:13:00 | 0.592649999999954
 2018-10-11 00:14:00 | 0.584149999999998
 2018-10-11 00:15:00 |  3.00854999999952
 2018-10-11 00:16:00 | 0.832999999999871
 2018-10-11 00:17:00 |  1.07154999999991
 2018-10-11 00:18:00 | 0.553600000000092
 2018-10-11 00:19:00 | 0.605799999999997
 2018-10-11 00:20:00 | 0.832000000000137
 ...

PERCENTILE_CONT 是逆分布函数, 给定一个百分比, 在一个连续分布模型上计算该百分比处的数值, 如果在该点处没有数据, 会根据最接近的前后值进行插值计算出实际值.

如果要在离散分布模型上计算百分比, 可以用 APPROXIMATE PERCENTILE_DISC 函数.

comments powered by Disqus