天下客 發表於 2020-3-10 13:54:00

python性能测试工具locust

<h2>一、简介</h2>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">  Locust 是一个易于使用,分布式,用户负载测试工具。它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发用户。在测试期间,一大群虚拟用户访问你的网站。每个测试用户的行为由您定义,集群过程由 web UI 实时监控。这将帮助您在让真正的用户进入之前进行测试并识别代码中的瓶颈。</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">  Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。</span></p>
<h2>二、安装</h2>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;用 pip 管理工具安装:&nbsp;</span></p>
<div class="cnblogs_code">
<pre>pip3 install locust</pre>
</div>
<p>&nbsp;<span style="font-family: &quot;comic sans ms&quot;, sans-serif">检查是否安装成功,执行命令:locust --v</span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200305175058994-2090512905.png"></p>
<p>&nbsp;</p>
<h2>三、压测过程</h2>
<h3>1.编写脚本</h3>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp; &nbsp; &nbsp; Locust 不同于 jmeter 可以用 GUI 来创建压测脚本。Locust 需要自己编写 python 脚本,压测负载脚本主要包含两个子类UserTask和WebsiteUser,分别继承TaskSet和Httplocust类,拥有这两个父类的公共属性和方法。</span></p>
<pre class="language-python highlighter-hljs"><code>from locust import HttpUser, TaskSet, task, between
import os,json

# 定义用户行为
class UserTask(TaskSet):
    def on_start(self):
      '''初始化数据,每个虚拟用户只执行一次'''
      self.client.post("/login",{"username":"test","password":"123456"})

    @task(2)
    def home_index(self):
      r = self.client.get("/sz/Home/DefaultHomeV2Request")
      assert json.loads(r.text)['Error'] == 0

    @task(1)
    def sale(self):
      self.client.get("/sz/Home/FlashSaleRequest")
      assert json.loads(r.text)['Error'] == 0

    def on_stop(self):
      '''销毁数据,每个虚拟用户只执行一次'''
      self.client.post("/SignOut",{"CustomerGuid":"c7d7e646-9ce2-499b-a22e-a3c98d4545fe"})

# locust 1.x版本      
#class WebsiteUser(HttpLocust):
#    host = 'https://10.1.62.133'
#    task_set = UserTask
#    wait_time = between(0, 0)
   
# locust 2.15版本弃用HttpLocust类,使用HttpUser替代
class WebsiteUser(HttpLocust):
    host = 'https://10.1.62.133'
    tasks =
    wait_time = between(0, 0)


if __name__ == "__main__":
    os.system('locust -f stress_test.py ')</code></pre>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;</span><span style="font-family: &quot;comic sans ms&quot;, sans-serif">locust 运行时:</span></p>
<ol>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;on_start()&nbsp; :每个并发用户在开始前各执行一次</span></li>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">on_stop():每个并发用户在结束后各执行一次</span></li>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">@task: 通过装饰器设置运行权重,比如上面代码中 执行任务 home_index 和 sale 的总请求为 2:1</span></li>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">assert:断言设置</span></li>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">wait_time :每个任务之间设置间隔时间,随机从3~5区间内取,单位是 s</span></li>
<li><span style="font-family: &quot;comic sans ms&quot;, sans-serif">locust -f:指定 .py 压测脚本路径</span></li>
</ol>
<p>&nbsp;</p>
<h3><strong>2. Locust 监控</strong></h3>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;顺带提一下 locust web UI监控是基于 flask 框架,不指定 port 的话,默认地址:http://localhost:8089&nbsp;</span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309144256694-586943011.png"></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;开始测试,Locust 提供一个简易的监控界面,可以看到 RPS、响应时间 和 部分曲线图</span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309144632235-682036643.png"><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309150526472-1466575394.png"><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309150545238-707273705.png"><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309150612248-210256435.png"></p>
<p>&nbsp;</p>
<h3>3.运行模式</h3>
<p>&nbsp;1.web UI 模式</p>
<div class="cnblogs_code">
<pre>locust -f stress_test.py --web-host <span style="color: rgba(128, 0, 128, 1)">10.1</span>.<span style="color: rgba(128, 0, 128, 1)">44.31</span> --web-port <span style="color: rgba(128, 0, 128, 1)">8090</span></pre>
</div>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">--web-host:指定 web UI IP,默认 localhost</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">--web-port:指定 web UI 端口,默认 8089</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">--logfile=app.log:日志输出到本地文件,不输出到控制台</span></p>
<p>&nbsp;</p>
<p>2. no web 模式</p>
<div class="cnblogs_code">
<pre>locust -f stress_test.py --no-web -c 100 -r 20 -t 120</pre>
</div>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">--no-web:指定无 web UI模式</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">-c:起多少 locust 用户(等同于起多少 tcp 连接)</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">-r:多少时间内,把上述 -c 设置的虚拟用户全部启动</span></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">-t:脚本运行多少时间,单位s</span></p>
<p>&nbsp;</p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">在 --no-web 模式下的报告如下:</span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309154655084-143503962.png"></p>
<p>&nbsp;</p>
<h3>4.分布式进程</h3>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;Locust 是由 python 编写的,由于GIL的限制,单进程不能利用CPU多核的优势(实际测试结果也是一样,8核心的虚拟机,只有一核达到了95%以上的使用率,其余7核只围观,不出力)。</span><span style="font-family: &quot;comic sans ms&quot;, sans-serif">所以单台机器上想要尽可能的压榨 CPU,只能开启多进程,一般有多少个核心启多少进程。(locust 2.15 版本启动节点 slave 弃用,改用 worker,请自行修改)</span></p>
<p><strong>单台多进程:</strong></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;先启一个 master</span></p>
<div class="cnblogs_code">
<pre>locust -f /home/script/stress_test.py --web-host <span style="color: rgba(128, 0, 128, 1)">10.1</span>.<span style="color: rgba(128, 0, 128, 1)">62.223</span> --master</pre>
</div>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;再启 8 个 slave</span></p>
<div class="cnblogs_code">
<pre>locust -f /home/script/stress_test.py --slave</pre>
</div>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">slave 节点启动后,在 locust 监控中能看到</span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309161558400-1582991332.png"></p>
<p>&nbsp;</p>
<p><strong>多台多进程:</strong></p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">&nbsp;多台机器搭建 Locust 分布式 和 单台搭建多进程差不多。<strong>只有一个区别,如果 slave 和 master 不在一台机器上, slave 需要指定 --master-host 参数:</strong></span></p>
<div class="cnblogs_code">
<pre>locust -f /home/script/stress_test.py --slave --master-host <span style="color: rgba(128, 0, 128, 1)">10.1</span>.<span style="color: rgba(128, 0, 128, 1)">62.223</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/i-beta/1236854/202003/1236854-20200309163521881-816534484.png"></p>
<p>&nbsp;</p>
<p><span style="font-family: &quot;comic sans ms&quot;, sans-serif">更多功能使用请查看Locust官方文档,形成良好的习惯</span> :官方文档&nbsp;</p>
<p>&nbsp;&nbsp;</p>
<h2>四、总结</h2>
<p>  <span style="font-family: &quot;comic sans ms&quot;, sans-serif">Locust 基于 python 脚本定制化压测,使用 python 语言来实现 参数化、关联参数、断言和一些复杂的压测场景非常方便。Locust 使用协程来构建tcp连接,本身单机并发能力强,但内部是由requests库的httpclient 发起网络请求,requests库功能挺全面,性能却很一般,好在 Locust 支持分布式,弥补了一定的性能缺陷。根据自己做的测试,同样几台客户机,jmeter搭建分布式测出的 qps 比 Locust分布式 高1/3。如果要提升 locust 单进程性能,可以将 httpclient 的实现方式从 requests 换成&nbsp;geventhttpclient ,这个下一篇再讲述。</span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/shenh/p/12424990.html
頁: [1]
查看完整版本: python性能测试工具locust