性能基准测试指标评估

发布于:2024-11-28 ⋅ 阅读:(13) ⋅ 点赞:(0)

背景:

做性能测试之前需要设置性能阈值来判断服务性能是否符合预期,但是没有统一的方法来规定怎样评估,所以这里总结了一个比较合理的方法来进行计算得到基准的性能指标,可以根据基准的性能指标进行深入的性能测试

P90、P95、P99的定义和计算方法

1. 什么是P90、P95、P99?
  • P90(90th Percentile):表示数据中90%以下的值都小于或等于这个数值,只有10%高于这个值。
  • P95(95th Percentile):表示数据中95%以下的值都小于或等于这个数值,只有5%高于这个值。
  • P99(99th Percentile):表示数据中99%以下的值都小于或等于这个数值,只有1%高于这个值。

这些百分位数(Percentiles)通常用于衡量系统性能的“尾部表现”,即在高负载或极端情况下的性能表现。它们比平均值或中位数更能反映系统的稳定性和最差情况下的用户体验。


2. 为什么要用P90、P95、P99?
  • P90:衡量大部分用户的体验,适合评估系统的整体性能。
  • P95:衡量少数用户的体验,适合发现性能瓶颈。
  • P99:衡量极少数用户的体验,适合评估系统在极端情况下的表现。

例如:

  • 如果接口响应时间的P95是500ms,说明95%的请求响应时间小于500ms,只有5%的请求超过500ms。
  • 如果P99是1000ms,说明99%的请求响应时间小于1000ms,只有1%的请求超过1000ms。

3. P90、P95、P99的计算方法
步骤1:准备数据
  • 收集性能数据(如响应时间、延迟等),并将数据按从小到大排序。
  • 使用requests请求接口并获取接口的响应时间,这个响应时间不包括下面三种时间。
    • 本地处理请求前的准备时间。
    • 客户端解析完整响应内容的时间。
    • 网络延迟之外的其他因素(如DNS查找、建立连接等)。
      在这里插入图片描述
response = requests.get('http://127.0.0.1:9527/getindex', params=params, headers=headers)
# 获取响应时间
response_time = response.elapsed
# 将响应时间转换为秒
response_time_in_seconds = response_time.total_seconds()
步骤2:计算百分位数的位置
  • 百分位数的位置公式为:

    位置 = (百分位数 × 数据总数) - 1

    其中:

    • 百分位数:如P90对应0.90,P95对应0.95,P99对应0.99。
    • 数据总数:数据的样本数量。
步骤3:找到对应的值
  • 如果计算出的“位置”是整数,则直接取该位置的数据值。
  • 如果“位置”是小数,则取相邻两个数据的加权平均值。

4. 示例:手动计算P90、P95、P99

假设有以下响应时间数据(单位:ms):

[100, 120, 150, 200, 250, 300, 350, 400, 450, 500]
计算P90
  1. 数据总数 = 10
  2. P90的位置 = (0.90 × 10) - 1 = 9
  3. 位置是整数,直接取第9个数据(从0开始计数):450ms
计算P95
  1. 数据总数 = 10
  2. P95的位置 = (0.95 × 10) - 1 = 9.5
  3. 位置是小数,取第9个和第10个数据的加权平均值:
    • 第9个数据 = 450
    • 第10个数据 = 500
    • 加权平均值 = 450 + (500 - 450) × 0.5 = 475ms
计算P99
  1. 数据总数 = 10
  2. P99的位置 = (0.99 × 10) - 1 = 9.9
  3. 位置是小数,取第9个和第10个数据的加权平均值:
    • 第9个数据 = 450
    • 第10个数据 = 500
    • 加权平均值 = 450 + (500 - 450) × 0.9 = 495ms

5. 使用代码计算P90、P95、P99
Python实现
import numpy as np

# 数据
data = [100, 120, 150, 200, 250, 300, 350, 400, 450, 500]

# 计算P90、P95、P99
p90 = np.percentile(data, 90)
p95 = np.percentile(data, 95)
p99 = np.percentile(data, 99)

print(f"P90: {p90} ms")
print(f"P95: {p95} ms")
print(f"P99: {p99} ms")
输出结果
P90: 450.0 ms
P95: 475.0 ms
P99: 495.0 ms

6. 注意事项
  1. 数据量足够大:百分位数的计算对数据量敏感,样本越多,结果越准确。
  2. 剔除异常值:在计算前,需清洗数据,剔除明显的异常值(如网络抖动导致的极端高延迟)。
  3. 动态监控:P90、P95、P99的值可能随时间变化,应定期重新计算。
  4. 以下是针对不同场景的定义
  • Web服务性能:
    • P90:衡量大部分用户的响应时间,适合评估整体性能。
    • P95:衡量少数用户的响应时间,适合发现性能瓶颈。
    • P99:衡量极端情况下的响应时间,适合评估系统的稳定性。
  • 数据库查询性能:
    • P90:大部分查询的执行时间。
    • P95:复杂查询的执行时间。
    • P99:极端情况下(如锁争用、慢查询)的执行时间。
  • 网络延迟:
    • P90:大部分用户的网络延迟。
    • P95:少数用户的网络延迟。
    • P99:极端情况下的网络延迟(如网络抖动)。