如何在Locust报告中显示真实百分位数?
Locust中如何计算准确的百分位数?
当前Locust生成的百分位数值总是被四舍五入到10的倍数,它默认通过估算百分位数来节省资源,但实际场景中真实百分位数不会如此规整。通过模拟测试发现,Locust计算的结果和Excel、numpy的准确计算存在明显差异——比如90分位数Locust给出的结果是0.961,而准确值更接近0.907或0.910。下面是几种解决方法:
方法一:调整响应时间桶的粒度
Locust默认用固定间隔的桶来聚合响应时间(默认间隔为10ms),这是导致结果被规整的核心原因。你可以修改stats.py中的相关代码,缩小桶的间隔(比如改成1ms),这样聚合后的结果会更接近真实值。
注意:更小的桶会占用更多内存,高并发场景下可能影响Locust的性能,需要根据测试规模权衡。
方法二:自定义精确的百分位数计算逻辑
放弃Locust默认的聚合桶方式,收集所有原始响应时间后用精确算法计算:
- 在测试脚本中添加全局变量存储所有原始响应时间
- 利用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
相关产品推荐
相关产品推荐

