【性能测试】【locust】快速入门
阅读原文时间:2021年06月07日阅读:1

简介

locust是一个开源的分布式用户负载压力测试工具,对网站(其他系统,例如接口等)进行负载测试,并确定可以处理多少的并发用户,locust特点利用了协程支持,达到高数量级别的并发,以及基于事件驱动使用gevent库来实现网络并发请求。https://www.locust.io/

环境配置

  • Python 3.8.2
  • pycharm
  • window or linux

安装locust

pip install locust

安装locust后,会自动下载对应的依赖库

  1. gevent: gevent是第三方库,通过greenlet实现协程, 当访问网络时,IO操作会消耗很长时间出现等待情况,greenlet会自动切换其他greenlet,直到IO操作完成,再切换回来,保证greenlet始终再运行,而不是再等待

  2. requests: requests库,http库,实现各种请求,get,post,put,delete, 这边在locust封装后与requests库对应使用

request

locust

request.post()

client.post()

request.get()

client.get()

request.delete()

client.delete()

request.put()

client.put()

  1. psutil:是一个监控库,监控cpu, 内存,磁盘等

  2. flask, Flask-BasicAuth: flask web第三方框架,Flask-BasicAuth:权限验证

  3. pyzmq: 可用于Locust分布运行在多个进程/机器上

实现原理

locust有比较重要的概念,一个定义用户行为(继承TaskSet), 一个是用户类(继承HttpUser)

定义一组用户将要执行的tasks场景,实现了虚拟用户所执行任务的调度算法,TaskSet子类重定义任务,采用@task装饰器

  • @task(1) 权重为1,@task(2)权重为2, 意思就是test_job2执行的频率是test_job1的两部

    from locust import TaskSet, task

    class UserBehavior(TaskSet):
    @task(1)
    def test_job1(self):
    self.client.get('/job1')

    @task(2)
    def test_job2(self):
        self.client.get('/job2')
  • 第二种权重写法

    from locust import TaskSet, task

    class UserBehavior(TaskSet):
    @task
    def test_job1(self):
    self.client.get('/job1')

    @task
    def test_job2(self):
        self.client.get('/job2')

    class WebUser(HttpUser):
    tasks = [test_job1, test_job2] # 不写的话比重就是1:1
    # tasks = {test_job1:1, test_job2:2} # 两种方式等价

代替了之前版本的Httplocust实例化时创建一个client属性,该属性是一个具有支持的HTTP客户端用于在请求之间保持用户会话,创建的HttpSession的实例。客户端支持cookies,因此在HTTP请求之间保持会话,由于request.Session, 再登陆系统后维持了登陆的seesion, 后面的task脚本操作都带上了session

简单示例

__author__ = 'wangxiao'

import os

# 导入包
from locust import HttpUser, task, between, TaskSet

# 定义task行为类继承TaskSet
class SouMiSearch(TaskSet):
    #
    @task
    def search(self):
        url = "/api/p/search/"
        body = {"keywords": "ceess"}
        with self.client.post(url, json=body) as response:
            print(response.text)

class WebUser(HttpUser):
    tasks = [SouMiSearch]
    wait_time = between(2, 5)
    host = "http://api.shoumilive.com:83"

if __name__ == '__main__':
    os.system("locust -f test_search.py")

# 运行

[2020-08-19 09:59:48,212] md2bkpyc/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/stable/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-08-19 09:59:48,212] md2bkpyc/INFO/locust.main: Starting web interface at http://:8089
[2020-08-19 09:59:48,229] md2bkpyc/INFO/locust.main: Starting Locust 1.1.1
  1. Number of total users to simulate: 设置总共的模拟用户总数
  2. Hatch rate (users spawned/second):每秒启动的虚拟用户数

场景设置

  • 设置用户总数10个,每秒启动5个

测试监控界面

页面指标

解析

备注

type

请求类型

Name

请求名称

这个可以自定义,传name参数即可

Requests

当前已完成的请求数量

Fails

失败的请求数量

Requests

当前已完成的请求数量

Median

响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒

90%ile

90%的响应时间在正态分布平均值下方,即小于这个值

Min

最小响应时间,单位为毫秒

Max

最大响应时间,单位为毫秒

average Size

平均每个请求的数据量,单位为字节

current RPS

每秒钟处理请求的数量

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章