主要知识点:
- percentile_ranks的用法
- percentile的优化
一、percentile_ranks的用法
SLA:就是所提供的服务的标准。 比如一个网站的提供的访问延时的SLA,确保所有的请求100%都必须在200ms以内,在大公司内一般都是要求100%在200ms以内,如果超过1s,则需要升级到A级故障,代表网站的访问性能和用户体验急剧下降。
现有一个需求:在200ms以内的有百分之多少,在1000毫秒以内的有百分之多少,对于这个需求就要用到percentile ranks metric这个方法,这个percentile ranks,在实际工作中比pencentile还要常用。他可以统计电商系统中按照品牌分组,计算,电视机,售价在1000元的占比,在2000以内的占比,3000占元以内的占比等等。
语法如下:
GET /website/logs/_search
{
"size": 0,
"aggs": {
"group_by_province": {
"terms": {"field": "province"},
"aggs": {
"latency_percentile_ranks": {
"percentile_ranks": {"field": "latency","values": [200,1000]}
}
}
}
}
}
执行结果如下:
"aggregations": {
"group_by_province": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "新疆",
"doc_count": 6,
"latency_percentile_ranks": {
"values": {
"200.0": 29.40613026819923,
"1000.0": 100
}
}
},
{
"key": "江苏",
"doc_count": 6,
"latency_percentile_ranks": {
"values": {
"200.0": 100,
"1000.0": 100
}
}
}
]
}
}
}
二、percentile的优化
percentile_ranks在es底层用的是TDigest算法,他会用很多节点来执行百分比的近似估计计算,当然也会有误差,但是所用到的节点越多越精准。
compression参数就是用来限制节点数量,默认compression的值是100,也就是compression * 20 = 2000个node去参与计算,compression越大,占用内存越多,越精准,性能越差
一个节点占大约占用32字节,100 * 20 * 32 = 64KB。如果你想要percentile算法越精准,compression可以设置的越大