我正在尝试分析系统中的延迟分布。以下列方式收集的延迟:然后测量每分钟观察到的最大延迟,如果此延迟是当天看到的最大延迟,则记录该值。在一天结束时,我有这样的事情:
[12, 15, 19, ..., 57, 120]
这是一天内看到的API调用时间。我需要从这些数据构建一些有用的指标,但我不知道如何!显然,如果我从这个数据集中计算平均值或中值,那就没有意义了。它不代表真实的中位数或平均值,因为如果最大延迟发生在一天的第一分钟 - 它将是中位数和平均值。我不能依赖最大值,因为这可能是由网络延迟等罕见事件引起的异常值。这个异常值不代表代码质量,也无助于捕获真正的错误。
您能帮我构建一下从这些数据中有意义的指标吗?
答案 0 :(得分:1)
假设您有报告数字的时间戳,您可以构建参数分布的似然函数,找到最大似然参数估计值,然后计算适当的分位数(0.95,0.99,0.999,无论如何)并报告作为每日多么糟糕的数字。我说参数分布是因为我不知道如何以非参数方式进行分配。
考虑到报告数字的时间戳,并假设每分钟观察一次延迟,您可以计算出报告中忽略了多少观察到的延迟;它只是从一个报告的数字到下一个报告的数字的分钟数。对于每个报告的数字x_i,在似然函数中存在项p(x_i | a),其中p是概率密度,并且a表示所有参数(一个或多个)。对于每个未报告的数字,在似然函数中存在项P(x_i | a),其中P是累积分布函数,x_i是最近报告的数;报告数字之间的一个间隙中未报告数字的所有项可以收集到单个项P(x_i | a)^ n_i中,其中n_i是间隙中未报告的数字的数量,x_i是左端点,x_ {i + 1}是正确的端点。
总之,似然函数是
L(a) = product(p(x_i | a), i, 1, n) * product(P(x_i | a)^n_i, i, 1, n)
其中n是报告的数字。使用它的对数可能更方便。手持L,策略是相对于a最大化L,然后计算P(x | a *)的分位数,其中a *是最大似然参数,并报告分位数。
我不知道什么是适当的分布以承担延迟。我会从Weibull发行版开始,但你可能需要尝试其他版本。
这里有各种未说明的假设。如果有兴趣,我可以填写详细信息。
答案 1 :(得分:1)
这是一种不同的方法,它是非参数的。你可以在上面和下面限制经验累积分布函数:在x_i和x_ {i + 1}之间,(1)它的下限是值的分数,当然小于或等于x_i,(2)它是在数值的分数上面肯定大于x_i。
这些界限可能非常宽松;反转经验c.d.f.将导致分位数的界限非常大 - 这意味着你所构成的“异常值”的边界只能在相对较宽的范围内知道。您可以做一个简化的假设,例如假设c.d.f.在x_i和x_ {i + 1}之间是分段线性的,以获得点值。
(1)只是观察到x_ {i + 1}之前的值(报告和省略)的总数除以全天的值总数。 (2)只是1减(x_i之后的报告值的数量(因为那些是我们确定的唯一大于x_i的值),除以全天的值总数。
编辑:更正(2)。