了解何时执行了足够的性能测试迭代的统计方法

Statistical method to know when enough performance test iterations have been performed

我正在对一项服务进行 performance/load 测试。想象一下这样的测试函数:

bytesPerSecond = test(filesize: 10MB, concurrency: 5)

使用它,我将填充 table 不同大小和并发级别的结果。还有其他变量,但你明白了。

测试函数启动 concurrency 请求并跟踪吞吐量。该比率从零开始,然后上升和下降,直到最终稳定在 'true' 值上。

然而,要达到这种稳定性可能需要一段时间,而且有很多输入组合需要评估。

test 函数如何确定何时执行了足够的样本? 足够,我想我的意思是如果继续测试,结果的变化不会超出一定范围。

我记得前一段时间读过一篇关于此的文章(来自一位 jsperf 作者),其中讨论了一种健壮的方法,但我找不到这篇文章了。

一种简单的方法是计算滑动 window 值的标准偏差。有没有更好的方法?

稳定性意味着变化率(导数)为零或接近于零。

The test function spins up concurrency requests and tracks throughput. This rate starts off at zero, then spikes and dips until it eventually stabilises on the 'true' value.

我会跟踪您过去的吞吐量值。例如最后的 X 值左右。根据这个值,我会计算变化率(你的吞吐量的导数)。如果您的导数接近于零,那么您的测试是稳定的。我会停止测试。

如何找到X?我觉得不是固定值,比如10,而是根据最大测试次数选择一个值会更合适,例如:

 X = max(10,max_test_count * 0.01)

IIUC,你描述的是estimating the confidence interval of the mean with unknown variance的经典问题。也就是说,假设您有 n 个结果,x1, ..., xn,其中每个 xi 都是您不太了解的某个过程的样本:不是均值,不是方差,也不是分布的形状。对于某些所需的置信区间,您现在想知道 n 是否足够大,以便真实均值很有可能在您的均值区间内。

(请注意,在相对较弱的条件下,Central Limit Theorem 保证样本均值将收敛于正态分布,但要直接应用它,您需要方差。)

所以,在这种情况下,classic solution判断n是否足够大,如下:

  • 从计算样本均值开始 μ = ∑i [xi] / n。同时计算归一化样本方差 s2 = ∑i [(xi - μ)2] / (n - 1)

  • 取决于n的大小:

    • 如果n > 30,置信区间近似为μ±zα/2(s / √(n)),如有必要,您可以找到herez的解释α.

    • 如果n < 30,置信区间近似为μ±tα/2(s / √(n));再次查看 here t 值的解释,以及 table.

  • 信心够了就停下来。否则,增加n.