You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Locust报告中显示真实百分位数?

Locust中如何计算准确的百分位数?

当前Locust生成的百分位数值总是被四舍五入到10的倍数,它默认通过估算百分位数来节省资源,但实际场景中真实百分位数不会如此规整。通过模拟测试发现,Locust计算的结果和Excel、numpy的准确计算存在明显差异——比如90分位数Locust给出的结果是0.961,而准确值更接近0.907或0.910。下面是几种解决方法:

方法一:调整响应时间桶的粒度

Locust默认用固定间隔的桶来聚合响应时间(默认间隔为10ms),这是导致结果被规整的核心原因。你可以修改stats.py中的相关代码,缩小桶的间隔(比如改成1ms),这样聚合后的结果会更接近真实值。

注意:更小的桶会占用更多内存,高并发场景下可能影响Locust的性能,需要根据测试规模权衡。

方法二:自定义精确的百分位数计算逻辑

放弃Locust默认的聚合桶方式,收集所有原始响应时间后用精确算法计算:

  1. 在测试脚本中添加全局变量存储所有原始响应时间
  2. 利用numpy或手动实现的精确百分位算法,在测试结束后计算结果

示例代码:

import numpy as np
from locust import HttpUser, task, events

# 全局存储所有请求的原始响应时间
raw_response_times = []

class PerformanceTestUser(HttpUser):
    @task
    def request_item_search(self):
        resp = self.client.post("/item_search")
        # 记录响应时间(单位:秒)
        raw_response_times.append(resp.elapsed.total_seconds())

@events.test_stop.add_listener
def calculate_precise_percentiles(environment, **kwargs):
    # 计算各种精确百分位数
    p50 = np.percentile(raw_response_times, 50, method='nearest')
    p90 = np.percentile(raw_response_times, 90, method='nearest')
    p95 = np.percentile(raw_response_times, 95, method='nearest')
    
    print(f"精确百分位数结果:")
    print(f"50%: {p50}, 90%: {p90}, 95%: {p95}")

注意:如果测试请求量极大,存储所有原始响应时间会消耗大量内存,需要根据实际测试规模评估可行性。

方法三:重写Locust的百分位计算函数

直接修改stats.py中的calculate_response_time_percentile函数,让它基于原始数据而非聚合桶计算。不过这种方法需要修改Locust源码,升级时需要注意代码兼容问题。

关于Locust默认估算百分位数的说明

Locust默认采用估算方式,是为了在高并发测试场景下平衡性能和统计开销——聚合桶的方式能大幅减少内存占用和计算资源消耗。对于大多数性能测试场景,近似百分位数足够判断系统性能表现;但如果业务对百分位精度有严格要求,就需要通过上述方法调整。

内容的提问来源于stack exchange,提问作者lazy619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:24:56