Locust简介* Q* s; l# x1 R. h- N
/ g' ?2 x# [/ j! [6 ^, ]2 I/ w
Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。并且有一个用户友好的 Web 界面,可以实时显示测试进度。甚至可以在测试运行时更改负载。它也可以在没有 UI 的情况下运行,使其易于用于 CI/CD 测试。
) k+ \& h6 q3 [9 E# ]Locust 使运行分布在多台机器上的负载测试变得容易。Locust 基于事件(gevent),因此可以在一台计算机上支持数千个并发用户。与许多其他基于事件的应用程序相比,它不使用回调。相反,它通过gevent使用轻量级进程。并发访问站点的每个Locust(蝗虫)实际上都在其自己的进程中运行(Greenlet)。这使用户可以在Python中编写非常有表现力的场景,而不必使用回调或其他机制。 " Y( u+ Q# G! r4 ^- O! d/ C% t
快速部署Locust6 J" h" A( m1 _) h) B5 z/ r8 H
1 g0 ]2 L! S0 G" o% M( Q6 oLocust 应用已发布到 开源应用商店,搜索 locust 安装最新2.5.1版本即可。 $ n* r) Y; J; B
0 A% E+ ~6 M+ @6 p1 a/ [, i% U) W
& W- }: z; G1 c+ R- }! D2 w
* S* ?6 x3 J6 k3 t; O+ p
安装完成后,您将会得到一个Locust主从集群,其中,master组件负责提供UI界面,和并发任务的调度;slave组件负责执行并发任务,slave组件同时支持横向伸缩,当产生的测试并发达到一定的限额时,只需扩展 slave 组件实例即可,例如:
$ N- ~& s( @9 R3 |. D
* R, o; S) f- d$ R0 N: v5 l
" g. {* Z1 X5 H如何使用
: J {& N6 N* r9 o8 z9 ?# ~
5 i+ ^1 O* R' l% A, ]0 g4 GLocust_Master 提供了一个基于WEB-UI的图形化管理界面,首次登陆,会提示输入一些信息:
* l9 D+ n( Z+ K% }) l4 B( K& N❝
1 T+ ~! r+ e& B$ D默认用户密码:locust locust,可配置 Locust_Master 组件的环境变量 LOCUST_WEB_AUTH进行修改。
( s( i. h2 h! Q❞
: g% N4 P2 b: J% ~/ Z; N C - Y2 |" N& w9 `. W
$ r, p, }- X1 }. d; m* f/ z
「Number of users」 填写模拟的并发用户数量,经过测试,单个slave实例可以轻松提供上千个用户并发的压力。
8 \& a& `$ K/ a5 l「Spawn rate」 填写蝗虫的孵化率,即每秒产生多少用户。 9 b; ]1 Q: q( b) o& z5 U7 X
「Host」 填写想要压测的站点地址。
0 g4 c$ l& R( w% \ h当Host以及用户,并发量定义完毕以后,还需要去定义一下测试用例,即用户访问Host之后的行为,Locust是通过一个名为/locustfile.py 的Python脚本来定义用户行为,在Rainbond平台的 Locust_Master 组件内 环境配置 -> 配置文件设置 进行编辑修改。 - @4 P6 K+ g1 q! n6 E
) b0 C+ G4 Z( e* ^$ z& u' ?7 u, Y" y" g* e: b
代码示例如下:
3 w8 j0 n( f& |& K* Qfrom locust import HttpUser, task, betweenclass MyUser(HttpUser): wait_time = between(5, 15) @task(2) def index(self): self.client.get("/") @task(1) def about(self): self.client.get("/docs/")这个脚本将按照顺序模仿以下行为:
; b0 b4 k: e6 M4 R/ G* a
$ e* F0 A7 L! ?" [- 请求Host的 / 路径两次
* w# x- B/ s# y' V- X0 X& r5 u - 请求Host的 /docs/ 路径一次
) q9 z+ A, ~( P4 x5 m* [ - 每次执行任务之间,间隔5-15秒
% y% m/ g6 W: d
之所以要这么设计的原因,是Locust的设计者们认为,真正的用户行为,不会像脚本一样接连不断的执行完所有的请求然后退出。更多的情况是,用户做完一件事后,会停顿一会,比如读读说明,思考下一步要干嘛。所以会在每个步骤之间留下一个随机时长的空白期。这种假设实际上更符合用户实际行为。
- Q; B3 X7 B; Q! Y/ T这个文件,将会以配置文件的方式挂载到 locust_master 组件上,并且共享挂载给所有的locust_slave组件。这意味着,如果你想要更改这个文件的内容,只需要去编辑 locust_master 组件中,环境配置下所挂载的配置文件即可。然后更新整个 Locust 集群即可生效。 8 w6 S) U& ?9 g5 E
结果分析
6 F' ]' a4 m# i) q. R k9 j7 x7 g3 n
借助Locust提供的WEB-UI界面,我们可以非常方便的分析压力测试结果。 & |% @# M( t5 m- Z2 P5 s
K; C( m, q) i' f
) h0 f, E- h) j4 r; }8 F5 NStatistics页面,将向我们展示所有被压测接口的汇总报告。结果包括:
: v9 a# n5 U8 Z4 t5 `「Type」 请求类型;$ t; K+ {$ p& P2 z8 o: N* H
「Name」 请求路径;
; Q: ]; r: {. O9 X「Requests」 请求总数;
7 S" V7 ?. L3 @: ]6 x「Fails」 失败次数;
1 I4 m& x& p5 a/ U3 F「Median」 中位数响应时间;# o1 w7 V* W% \7 [/ Z1 [0 M9 T1 I
「90%ile」 90%请求响应时间;
" `" D: z7 z$ c: q5 f「Average」 平均响应时间;2 s. B" v3 z' V: N
「Min」 最小响应时间;" {/ x7 T! I* F0 n
「Max」 最大响应时间;( D0 ^+ L& @$ T( ]7 t/ i3 C
「Average size」 请求的平均大小;% z4 N/ W x5 _9 M% p/ k% y" N
「Current PRS」 当前吞吐率;% U4 q/ z$ ~ j
「Current Failures」 当前错误率;
1 i* e5 \% n* b+ ?) M, {# }; L7 `% Q) J' Y! M
, ^' t$ @* c! L7 S1 ]
Charts页面将主要结果绘制成为随时间变化的图表,能够在趋势上给予用户指引。 : B, @) ^' P5 Y0 h4 q+ U$ Q
除了这些之外,还有几项值得关注的值会在最上面一排全局展示,包括当前请求的主机域名、当前产生的并发用户数量、slave节点数量、当前所有请求接口的总吞吐率、错误率。以及停止测试的按钮。
* X" z/ a+ J# D; X" R& o$ _其它的几个页面会提供: k0 @* ^% j# k
「Failures」 请求失败的接口及失败原因;2 M+ ^+ u9 G2 l/ \5 V4 }
「Expections」 测试中意外的错误以及错误原因: W7 q7 O8 D+ i$ |3 S% c
「Download Data」 csv格式的测试数据下载地址$ z4 o$ W/ o' z
「Workers」 所有slave实例的信息
3 T- [* Q: A1 ]) A更多教程请参考Locust官方文档
% [+ D4 N w+ p% M6 w) z关于Rainbond8 _$ e$ Y6 X9 I1 q' N
8 {# J. |6 O1 R) _/ n7 ]# q: B( p
Rainbond 是一个开源的云原生应用管理平台,使用简单,不需要懂容器和Kubernetes,支持管理多个Kubernetes集群,提供企业级应用的全生命周期管理,功能包括应用开发环境、应用市场、微服务架构、应用持续交付、应用运维、应用级多云管理等。 ; K# N! l# q2 z, _9 Z, b% `
Github:https://github.com/goodrain/rainbond' s% i4 B1 T: M
官网:https://www.rainbond.com?channel=toutiao
1 d" _' y* e8 V3 R* T 微信群:请搜索微信公众号 Rainbond 关注并添加群助手入技术交流群' h1 G) t+ N* ?. a. A) _4 ~3 w, S
钉钉群:请搜索钉钉群号 31096419 |