作为一个开源分布式压测工具,Locust其实解决这么一个问题:Locust并发机制摒弃了进程和线程,采用协程机制,从而可以大幅提高单机的并发能力。本质上,应用Locust做压测,就是在写Python程序。
经过一段时间的服务端性能测试,也先后了解及使用过一些性能测试工具,本篇中,向大家推荐Locust这款开源工具。Locust的本意为”蝗虫“,意为由Locust生成的并发请求就跟一大群蝗虫一样,对我们的被测系统进行攻击,以此来检验系统在高并发下的性能。大家可以随意感受下。
将Locust与常用的LoadRunner和Jmeter进行对比,详细参数如下:
通过上述图表,可能大家会觉得,Locust也不怎么样嘛,不支持资源监控,报告分析也是简单图表。那为什么还要选它呢? 我们在考虑选择性能测试工具时,主要考虑2个方面:模拟真实用户操作、模拟有效并发。 先说下模拟用户真实操作。在Locust测试框架中,测试场景是采用Pure Python脚本描述,并且HTTP请求完全基于Requests库。熟悉Requests库的人都知道,这个库能够非常方便的发送请求和处理响应,很多其他编程语言的HTTP库都借鉴它的思路。除了HTTP协议外,Locust也可以测试任意协议的系统,只需要采用Python调用对应的库进行请求即可; 再说一下有效并发。Locust的并发机制采用协程。采用多线程模拟多用户时,线程数会随着并发数的增加而增加,而线程之间的切换需要占用资源,IO阻塞等原因不可避免的造成并发效率下降;正因如此,LoadRunner和Jmeter这类依靠进程和线程的工具,在单机上很难有较高的并发,会受到本机性能的制约。而协程与线程的区别在于,协程避免了系统级资源调度,大大提高了性能。正常情况下,单台普通配置的测试机器可以产生数千的并发量,这是LoadRunner和Jmeter都无法实现的。
那么如何使用Locust进行性能测试呢? 编写Locust脚本,是使用Locust的第一步。简单示例如下:
上述脚本是如何表达测试场景的呢? 首先,该脚本主要包含两个类,一个是UserBehavior,继承自TaskSet;还有一个是WebsiteUser类,继承自HttpLocust,而HttpLocust类继承自Locust。 其中,TaskSet类用于描述用户行为,包括任务执行顺序、挑选下一个任务、执行任务等。
在Locust类中,具有一个client属性,对应着客户端的请求能力。
(一)单进程运行: 在终端中输入如下命令,执行web类型的测试
此时打开浏览器,访问http://localhost:8089/即可进入Locust的Web管理页面。(默认端口为8089)
其中 Number of users to simulate:设置模拟用户数 Hatch rate (users spawned/second):每秒产生/启动的虚拟用户数 设置好之后,点击Start swarming就可以执行测试了。 (二)多进程分布式运行 不管是单机多进程,还是多机负载模式,运行方式都一样,都是先运行一个master,再启动多个slave 启动master时,需要使用--master参数,master启动后,需要启动slave才能执行测试任务,启动slave需要使用--slave参数。
之后的操作方法同web类型。
测试结果
相比于LoadRunner,Locust结果展示很简单,可以实时在web页面中看到。主要指标包含:并发数,RPS,响应时间,异常率。对于大多数测试场景来说,这几个指标已经足够了。
RPS和平均响应时间这两个指标显示的值都是最近2秒请求响应数据得到的统计值,可以理解为瞬时值。数据走势可以在Charts中看到。
Total Requests per Second:每秒请求数; Response Times(ms):平均响应时间; Number of Users:用户数。
Locust有很强的可扩展性,当遇到一些复杂的性能测试场景时,可以方便的进行定制化测试。当然,一些性能测试的增强型用法,比如参数化、关联、断言等,都可以通过Python的脚本增强来实现,一起来研究一下吧。