性能测试工具 关于 locust 并发数量的疑问(Number of Users 设置成 20 竟然和 1 时的 RPS 相同?)

huangshengnan · 2021年11月10日 · 最后由 huangshengnan 回复于 2021年12月01日 · 3905 次阅读

今天在使用 locust 和 JMeter 作比对时发现,Number of Users 设置成 20 竟然和 1 时的 RPS 都是 130、响应时间也一样(现象见下图)。设置多 worker 或换 JMeter 压,RPS 轻松突破 130,负载机和服务器资源都够用。请问这是为什么?难道是单个 worker 有什么限制。

1、20Vuser 时,RPS=132

2、1Vuser 时,RPS=131😂

3、换成 JMeter,同样的负载机、接口和场景,20Vuser 时,TPS=581。也看了后台服务器资源情况,排除了负载机和服务器资源、系统流控等问题。

4、设置 2 个 worker 2Vuser 执行,RPS 相较 “1worker 2Vuser”,翻了一倍。

补充说明:场景非常简单(就单接口压测),接口是自定义协议、非 http。

共收到 9 条回复 时间 点赞

你不确认一下 locust 的 wait_time 是指什么吗?

江涛依旧 回复

没有设置 wait_time

如果以下问题需要先排除:
【1】环境特殊的配置
【2】locust 的 bug
【3】压测机资源负载情况
【4】脚本中做了延长事务时间的处理(比如构造协议、复杂的断言、解析)

另外 locust 本身的压测能力是有一些不足的,这点 locust 和 jmeter 做比较的文章网上已经很多了:
因为 python 的语言特性还有默认的 requests 包都是影响 locust 压测能力的,官方也推荐大家使用 FastHttpLocust(据说提高 5-6 倍)。
但你说你的非 http 的,那你还想使用 locust 的话,建议换其他语言的 locust 的压测端,比如 boomer。

JoyMao 回复

感谢您的回复。
我也做了一些排查,目前倾向怀疑是 locust 对自定义协议支持有 bug,或我的用法有问题,但没办法真正确认。

【排查内容】
1、同样的环境下与 JMeter 比对,JMeter 多线程生成的负载远高于单进程多协程的 locust;
2、协议支持 Python 和 Java 对接,不论是 Python 直接对接,还是通过 Jpype 引入 jar 包,然后用 locust 发包,结果一致;
3、task 换成 http 协议,甚至直接 sleep(),Number of Users 参数均正常生效;
4、监控负载机(40 核)和服务器资源(48 核),运行状态下,内存和每一个核心都是比较空闲的状态;
5、多进程分布式执行,虽然负载翻倍,但并发数受限于负载机 CPU 核数,且无法真正用到 locust 的协程。

我现在想打印出压测过程中每个协程的具体操作,但不太熟悉协程,暂时还无从下手。

JoyMao 回复

另外您提到的将压测端换成 boomer,我也想过,但目前协议还不支持 GO 语言。

huangshengnan 回复

locust 本地也可以多起 1 个或多个实例来提高负载利用

JoyMao 回复

是的,但感觉并发数会受限于负载机 CPU 核数(进程间切换消耗大),且无法真正用到协程

两个方面:
1.不要采用默认的 httpUser,采用 FastHttpUser(古早版本叫 FastHttpLocust),httpUser 是继承了 python 的 requests 库,但是 FastHttpUser 才是更好地用到了协程;
2.把 Vuser 写得夸张一点,我之前 Vuser 写 50,RPS 只能到 200 多,但是我 Vuser 写到 1000,后面 RPS 达到 500 多,但是 Vuser 写得太夸张可能会导致获取的响应时间有一点失真。所以 Vuser 尽量调到刚好达到系统 RPS 上限的量
从外面别人写的博文做 jmeter 和 locust 之间的比较,fasthttp 都应该比 jmeter 能达到的压力上限大一点


应该是被测协议不支持协程,代码执行到发包时不会切换到其他协程执行,感谢各位

huangshengnan 关闭了讨论 12月01日 17:30
huangshengnan 重新开启了讨论 12月01日 17:31
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册