赞
踩
压测工具有很多,以前也接触过不少,今天整理了一下新接触的locust工具。Locust是一个开源负载测试工具。可以定义用户行为,也可以仿真百万个用户。Locust是非常简单易用,分布式,用户负载测试工具。
Locust是完全基于时间的,因此单个机器可以支持几千个并发用户。相比其他许多事件驱动的应用,Locust 不使用回调,而是使用轻量级的处理方式 gevent。Gevent 是一个基于 greenlet 的 Python 的并发框架,以微线程 greenlet 为核心,使用了 epoll 事件监听机制以及诸多其他优化而变得高效。
Locust原来叫做Locustio,现在安装不能再使用Locustio了,如下:
- # 安装locustio模块会出现报错,因为已经更名。
- [root@test ~] pip install locustio
- #Locust package has moved from 'locustio' to 'locust'.Please update your reference (or pin your version to 0.14.6 if you dont want to update to 1.0)
- ERROR: Failed building wheel for locustio
- ERROR: Could not build wheels for locustio, which is required to install pyproject.toml-based pyproject.toml-based projects
- # 直接安装 locust
- [root@test ~] pip install locust
- Successfully installed ...
- #会安装很多扩展。
写好相对应的脚本,使用locust -f test.py启动后,在浏览器中访问localhost:8099即可打开压测设置界面,里面有三个设置数据了解一下。
Number of users (peak concurrency):用户峰值,即一共启动多少个用户
Spawn rate (users started/second):每秒启动用户数,这个数是让所有用户不要一下全启动,而是陆续启动,一直达到峰值的数据量。
Host:请求的host
注意:Number of users并不是并发数,Spawn rate更不是并发数,网上好像误导,经过我多次压测以及数据对比,我认为这里只是用户数,真正的并发数看压测界面上的RPS即每秒的请求数,这个数和Number of users以及脚本中配置的wait_time有关。
wait_time:等待时间,是指用户在每个任务执行后等待多少时间,等待时间可以促使性能测试更贴近实际中的场景,单位为秒。例如wait_time = between(2, 5)表示等待2-5秒之间,选择的值是随机的。启动的用户数和随机的请求时间就会随机自动得出RPS,但这样这个RPS不是一个可控的数据,
Locust任务等待wait_time主要有三种方式,分别是constant、between、constant_pacing.
constant(2) # 任务执行完毕等待2秒开始下一任务。
between(1,7) # 任务执行完毕等待1-7秒(中间随机取值)开始下一任务
constant_pacing(2) # 设置任务启动总得等待时间,若任务耗时超过该时间,则任务结束后立即执行下一任务;若任务耗时不超过该时间,则等待达到该时间后执行下一任务。
constant_throughput自适应时间,以确保任务每秒最多运行 X 次。
constant_pacing自适应时间,确保任务(最多)每 X 秒运行一次(它是constant_throughput的数学反转)
比如如果你要使用 Locust 实现 200 的并发测试,可以使用 wait_time = constant_throughput(0.1) 和用户总数 2000 搭配使用即可,这样这个RPS就是一个可控的数值。
我们使用 locust 做压力测试时,遇见报错: RemoteDisconnected(‘Remote end closed connection without response)。服务端为基于 gunicorn 搭建的 python 后端服务。压测中发现执行一段时间后就会出现一些失败请求 fails,点开查看基本就是以下两种错误:
keepalive:The number of seconds to wait for requests on a Keep-Alive connection.
1. RemoteDisconnected('Remote end closed connection without response)
2. locust ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接 10054)
看其意思都是连接丢失或者远程主机关闭连接,但服务器上没有任何异常,所有的请求返回都是200状态。推测这应该和 gunicorn 的配置有关,经过尝试调整几个配置值,发现其与 keepalive 配置项强相关。
默认keep-alive值为2,单位为秒,表示连接上等待请求的秒数,即2秒没有处理的请求会被关闭连接,一般设定在1~5秒之间。我未设置 keepalive 时,发现 locust 的界面上只要 Max (ms) 接近2000,则开始有 fails 报错。而当我把 keepalive 调整到5后,发现就没有 fails 报错了。
因此推测,keepalive的时间值设置会影响 fails 的产生数量。相当于一个阈值设置。这个阈值越大,可以允许的连接等待时间越长,加大 keepalive 配置的值,就是延长连接的等待时间或过期时间。但当然并不是这个数值越大越好,用户的等待时间也是有限的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。