我们使用升压累加器来计算服务器请求时间百分比,如下所示:
array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]),
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=float32)
新值插入如下:
array([array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]),
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])], dtype=object)
,百分数使用以下方法计算:
static constexpr size_t ROLLING_WINDOW_SIZE = 1000;
using accumulator_t = boost::accumulators::accumulator_set<long long int,
boost::accumulators::stats<boost::accumulators::tag::extended_p_square_quantile,
boost::accumulators::tag::rolling_count> >;
const std::array<double, 4> QUANTILE_PROBABILITIES = { 0.5, 0.75, 0.95, 0.99 };
....
Percentiles::Percentiles() :
m_accumulator(boost::accumulators::extended_p_square_probabilities = QUANTILE_PROBABILITIES,
boost::accumulators::tag::rolling_window::window_size = ROLLING_WINDOW_SIZE) {}
我们看到的问题是,累加器实际上并没有真正计算指定滚动窗口大小上的分位数,而是将某些值保留了更长的时间,并将其用于计算。这就导致了这样一种情况,即在99_percentile快速增加(临时增加)之后,即使问题消失并且最近的1000个值看起来很好,它的恢复也非常缓慢。任何想法将不胜感激。