当服务的第 99 个百分位数下降而第 50 个百分位数增加时,这意味着什么?

What does it mean when 99th percentile has decreased and 50th percentile has increased for a service?

我正在尝试比较两种服务的性能。其中一个运行在较旧的代码库上,另一个运行在较新的实现上。我试图根据仪器绘制数字,并且我正在比较 30 秒采样周期的平均值(第 50 个百分位)和最大(第 99 个百分位)数字。

观察结果是,对于较新的服务:第 50 个百分位数增加了 40%(从 0.05 毫秒增加到 0.07 毫秒),而第 99 个百分位数从 17 毫秒减少到 11 毫秒。

我已经跟踪了一整天的行为。

我的问题是:

这说明了新代码库的性能如何?

提前致谢。

较新的代码库通常稍微慢一些(从 0.05 毫秒增加到 0.07 毫秒)但没有那么多的峰值(从 17 毫秒下降到 11 毫秒)。

是否是好事取决于用例或要求。

例如,如果服务必须始终在 15 毫秒内响应,这是一个很好的改进。如果服务必须在 0.1 毫秒内回答,这不是一个很好的改进,因为服务不会更频繁地及时回答,如果服务没有回答,无论是 10 毫秒还是 15 毫秒。

你要记住的是测量的精度。在如此小的时间跨度(0.05ms 或 50ns)中,测量方法存在缺陷的可能性比 10ms 这样的时间跨度要大得多。

average (50th percentile)

第 50 个百分位是中值或典型延迟。平均值是所有延迟的总和除以数量,通常大于中值。如果你的平均值比你的中位数高 20%,你就做得很好。它可以是很多倍,甚至是你典型值的 10 倍。

and max (99th percentile)

实际上,第 99 个百分位数就像我看到的最小值。这是 JMH 的一个例子。

Result "rwire8bit":
  344.069 ±(99.9%) 0.029 ns/op [Average]
  (min, avg, max) = (279.000, 344.069, 8224.000), stdev = 24.468
  CI (99.9%): [344.039, 344.098] (assumes normal distribution)
  Samples, N = 7496517
        mean =    344.069 ±(99.9%) 0.029 ns/op
         min =    279.000 ns/op
  p( 0.0000) =    279.000 ns/op
  p(50.0000) =    342.000 ns/op
  p(90.0000) =    362.000 ns/op
  p(95.0000) =    364.000 ns/op
  p(99.0000) =    371.000 ns/op
  p(99.9000) =    379.000 ns/op
  p(99.9900) =    520.696 ns/op
  p(99.9990) =   2648.557 ns/op
  p(99.9999) =   5904.056 ns/op
         max =   8224.000 ns/op

现在是对包含 6 个字段的消息进行编码和解码的时候了。关键是第 99 个百分位应该只是性能调整的开始,你有第 99.9、99.99、99.999、99.9999,最大值是有史以来最差的样本。注意:此测试 运行 大约有 2 亿个样本。

What does this tell about the performance of the newer codebase?

当系统旨在提高其性能的一致性时,这是一种常见情况。

您愿意在您的典型延迟上做出一些折衷,以便您的最差延迟更好。

The observation is that for the newer service: the 50th percentile has increased by 40% (increased from 0.05ms to 0.07ms) while the 99th percentile has gone down from 17ms to 11ms.

根据经验,如果您的第 99 个百分位数不应超过典型值的 4 倍,这对我来说表明通过优化您应该能够将第 99 个百分位数减少到 0.28 毫秒而不是 11 毫秒,但这取决于您正在测试的各种操作。