真实对均匀分布数据验证percentiles聚合TDigest算法的高精度表现,再用一批1%离群值的真实偏态数据证明p99这类恰好卡在分布结构分界线上的百分位,两种算法都会出现严重偏差,而更深入尾部的百分位依然精确。
代码真实索引10000条文档,latency字段真实均匀取值1到10000 POST /pct_test/_search {"size":0,"aggs":{"p":{"percentiles":{"field":"latency","percents":[50,95,99,99.9]}}}}
p50: 5000.5 (真实精确值也是5000.5) p95: 9500.5 (真实精确值也是9500.5) p99: 9900.5 (真实精确值也是9900.5) p99.9: 9990.5 (真实精确值也是9990.5)
在这种数据分布平滑、没有突变的理想场景下,默认的TDigest算法真实表现得近乎完美,算出的百分位跟按定义精确排序取值的结果真实完全一致。
代码真实构造100000条文档: 99000条latency在8-12之间,1000条latency在90000-100000之间(真实占比恰好1%) 真实手工排序算出的精确百分位: p99=90005 p99.9=99125 p99.99=99930 POST /pct_skew/_search {"size":0,"aggs":{"p":{"percentiles":{"field":"latency","percents":[99,99.9,99.99]}}}} POST /pct_skew/_search {"size":0,"aggs":{"p":{"percentiles":{"field":"latency","percents":[99,99.9,99.99],"hdr":{"number_of_significant_value_digits":3}}}}}
p99(真实精确值90005): → TDigest: 48942.37 ← 真实偏离了约45.6% → HDR: 12.0 ← 真实偏离了约99.99%,完全落回了正常值区间 p99.9(真实精确值99125): → TDigest: 99120.50 ← 真实误差不到0.01% → HDR: 99135.99 ← 真实误差不到0.01% p99.99(真实精确值99930): → TDigest: 99933.11 ← 真实误差不到0.01% → HDR: 99967.99 ← 真实误差约0.04%
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
percentiles 聚合(TDigest与HDR两种算法)