最近公司有性能测试的需求并且由我来负责完成,刚好趁此机会探索对比下Jmeter和Locust。
测试环境
开了两台EC2,其中一台做压力机,另一台做服务器,配置为2核-8G。
准备工作
这里关于Jmeter,Locust 等相关的环境安装就不在赘述,百度上一搜跟着操作就完事…
1. 服务器准备
直接在EC2上起服务,对外提供了接口…
服务启动后进行测试…很简单的一个get接口,返回了固定的数据.
2. Jmeter脚本准备
非常简单的一个脚本…不在赘述
3. Locust脚本准备
也是非常简单的一些代码,参考官方demo即可完成,需要注意的是,这里我们使用FastHttpUser,性能上比HttpUser高非常多。
from locust import task,FastHttpUser
class ProductUser(FastHttpUser):
@task
def get_product_list(self):
self.client.get("/api/v1/product/list")
结果对比
Jmeter GUI 模式—Locust 控制台启动 headless
1. 低延迟接口
Locust web模式下不支持指定运行时间…这里使用控制台启动
工具 | 并发用户数 | 运行时间 | 总请求数 | TPS |
---|---|---|---|---|
Jmeter | 10 | 1min | 366970 | 6116.8/s |
Locust | 10 | 1min | 154040 | 2599.1/s |
从以上结果中可以看出来,Jmeter的发压能力明显要高于Locust大概两倍多一点。
由于我们的压力机是2核的,我们再此场景下试下Locust分布式看看会不会有所提升…
–expect-workers=2 表示2个workers连接成功后才会开始
master:
locust -f locustfile.py --master -u 10 -r 10 -t 1m -H http://13.232.174.90:8080 --headless --expect-workers=2
worker:
locust -f locustfile.py --worker
工具 | 并发用户数 | 运行时间 | 总请求数 | TPS |
---|---|---|---|---|
Jmeter | 10 | 1min | 366970 | 6116.8/s |
Locust | 10 | 1min | 223142 | 3703.7/s |
看上去是有所提升的…但是还是没干过Jmeter(运行期间cpu占用率非常高,这可能是Locust无法产生更多压力的原因吧…)
测试到这实际上Locust基本上已经到瓶颈了,CPU已经爆了…但为了验证这一观点,我们继续增加并发用户数测试看看…
工具 | 并发用户数 | 运行时间 | 总请求数 | TPS |
---|---|---|---|---|
Jmeter | 15 | 1min | 491902 | 8214.4/s |
Jmeter | 30 | 1min | 552190 | N/A |
Jmeter | 40 | 1min | 567633 | N/A |
Jmeter | 50 | 1min | 569544 | N/A |
Jmeter | 60 | 1min | 507048 | N/A |
Jmeter | 100 | 1min | 518299 | N/A |
Jmeter | 500 | 1min | 602410 | N/A |
Jmeter | 1000 | 1min | 618274 | N/A |
Jmeter | 1500 | 1min | 717878 | N/A |
Jmeter | 2000 | 1min | 638343 | N/A |
Locust | 15 | 1min | 251888 | 4175.3/s |
Locust | 50 | 1min | 294639 | 4880.5/s |
Locust | 100 | 1min | 300082 | 4974.1/s |
Locust | 500 | 1min | 300297 | 4899.2/s |
Locust | 2000 | 1min | 270802 | 4531.1/s |
结论:从以上数据中可以看出来Jmeter明显优于Locust
1. 高延迟接口
工具 | 并发用户数 | 运行时间 | 总请求数 | TPS |
---|---|---|---|---|
Jmeter | 50 | 1min | 11527 | 190.8/s |
Jmeter | 100 | 1min | 23069 | 381.4/s |
Jmeter | 500 | 1min | 48031 | 789.6/s |
Jmeter | 1000 | 1min | 48418 | 787.1/s |
Jmeter | 1500 | 1min | 48994 | 785.1/s |
Locust | 50 | 1min | 11925 | 198.8/s |
Locust | 100 | 1min | 23686 | 394.8/s |
Locust | 500 | 1min | 47635 | 793.3/s |
Locust | 1000 | 1min | 47469 | 789.2/s |
Locust | 1500 | 1min | 47203 | 783.7/s |
结论:在耗时的接口上Jmeter和Locust两者的结果基本是差不多。
结论&总结
本文分别使用Jmeter和Locust 对两个接口进行了压测,在低延迟接口上Jmeter明显优于Locust…而在高延迟的接口上Jmeter和Locust基本达成平手。如果Jmeter使用命令行模式的话应该还能有所提升…
所以如果有变成能力的或者场景比较复杂推荐实用Locust会更方便一些,常规的场景测试推荐实用Jmeter…,另外在分布式上Locust会更简单些。
至于为什么在低延迟的接口上Jmeter明显优于Locust,而在高延迟的接口上两者基本持平,这个问题暂时还没有想明白…