性能测试 - 响应时间的衡量指标 RPS Average Min Max P90 P95 P99

1,077 阅读3分钟

引言

性能测试的报告,通常会涉及到一些响应时间的考量指标,如 Locust Report :

image.png 我们通常关心的有这几个:RPS, Average, Min, Max, P90, P95, P99

内容提要:

  1. 响应时间的衡量指标的定义
  2. 百分位数指标概念,计算方法
  3. python 如何计算这些性能指标

衡量指标的定义 RPS 衡量服务器的吞吐能力,每秒服务器处理的请求数(也称 TPS 每秒处理的事务数) RPS = 总请求数 / 请求的总耗时

Avg 衡量服务器大体处理情况,平均处理每个请求耗时。 Avg = 请求总耗时 / 请求总数 但是这个指标通常会掩盖一些异常值,不够全面。

Min 从单个请求耗时最小的值

Max 从单个请求耗时最大的值

P90 单个请求响应耗时从小到大排列,顺序处于90%位置的值即为P90 值。

P95 单个请求响应耗时从小到大排列,顺序处于95%位置的值即为P95 值。

P99 单个请求响应耗时从小到大排列,顺序处于99%位置的值即为P99 值。

百分位数: 正因为平均值不能反映极端异常情况,所以要借助百分位数值,能更加精确的定位到性能数据的差异化分布。

将一组数值按从小到大的顺序排列,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组 n 个观测值按数值大小排列。如,处于 p% 位置的值称第 p 百分位数。

计算第 P 百分位数步骤:

第1步:以递增顺序排列原始数据(即从小到大排列)。 第2步:计算指数 i=np% 第3步: 若 i 不是整数,将 i 向上取整。大于 i 的毗邻整数即为第 p 百分位数的位置。 若i是整数,则第 p 百分位数是第 i 项与第 (i+1) 项数据的平均值。

例 1: 如求数列:3、2、5、4、6、7 的80分位数

  • 排序:2、3、4、5、6、7
  • 求百分位数的位置:i = 6*0.8 = 4.2
  • 确定百分位数的值: i=4.2 不是整数,向上取整 5,那么排在位置为5的值 6 就是该数列的80分位数, 所以 P80 = 6

例 2: 如求数列 L: 2、4、3、5、6 的80分数数

  • 排序:2、3、4、5、6
  • 求百分位数的位置: i = 5*0.8 = 4
  • 确定百分位数的值: i=4 是整数, (L[i] + L[i + 1] ) / 2, 即 (5 + 6 ) / 2 = 5.5, 所以 P80 = 5.5

Python 计算各项指标

1. 利用 Excel 公式
AVERAGE(range) PERCENTILE.INC(range, p%) MIN(range) MAX(range)

例如计算 H 列的衡量指标\

image.png

# Header
sheet.cell(2, 14).value = "Average(Second)"
sheet.cell(2, 15).value = "P90(Second)"
sheet.cell(2, 16).value = "P95(Second)"
sheet.cell(2, 17).value = "P99(Second)"
sheet.cell(2, 18).value = "Min(Second)"
sheet.cell(2, 19).value = "Max(Second)"
# Value
sheet.cell(3, 14).value = "=ROUND(AVERAGE(H2:H{}),2)".format(row_index-1)
sheet.cell(3, 15).value = "=ROUND(PERCENTILE.INC(H2:H{},90%),2)".format(row_index-1)
sheet.cell(3, 16).value = "=ROUND(PERCENTILE.INC(H2:H{},95%),2)".format(row_index-1)
sheet.cell(3, 17).value = "=ROUND(PERCENTILE.INC(H2:H{},99%),2)".format(row_index-1)  
sheet.cell(3, 18).value = "=ROUND(MIN(H2:H{}),2)".format(row_index-1) 
sheet.cell(3, 19).value = "=ROUND(MAX(H2:H{}),2)".format(row_index-1)

  1. numpy 自带计算方法
import numpy as np
a = np.array([1,2,3,4,5])
p_90 = np.percentile(a, 90)
p_95 = np.percentile(a, 95)
p_99 = np.percentile(a, 99)
avg = np.average(a)
min = np.min(a)
max = np.max(a)
print("p90 = {} p95 = {} p99 = {} avg = {} min = {} max = {}".format(p_90, p_95, p_99, avg, min, max))

输出:

p90 = 4.6 p95 = 4.8 p99 = 4.96 avg = 3.0 min = 1 max = 5