• 【性能测试】【locust】快速入门


    简介

    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)

    TaskSet

    定义一组用户将要执行的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} # 两种方式等价
    

    HttpUser

    代替了之前版本的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
    

    默认端口8089, 浏览器访问127.0.0.1:8089

    1. Number of total users to simulate: 设置总共的模拟用户总数
    2. Hatch rate (users spawned/second):每秒启动的虚拟用户数

    场景设置

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

    测试监控界面

    Statustics

    页面指标 解析 备注
    type 请求类型
    Name 请求名称 这个可以自定义,传name参数即可
    Requests 当前已完成的请求数量
    Fails 失败的请求数量
    Requests 当前已完成的请求数量
    Median 响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒
    90%ile 90%的响应时间在正态分布平均值下方,即小于这个值
    Min 最小响应时间,单位为毫秒
    Max 最大响应时间,单位为毫秒
    average Size 平均每个请求的数据量,单位为字节
    current RPS 每秒钟处理请求的数量

  • 相关阅读:
    构建之法 读书笔记二
    聚集索引,非聚集索引,覆盖索引
    最佳左前缀法则
    悲观锁和乐观锁
    JVM (三)- GC 垃圾回收器
    JVM 内存模型
    Java内存模型(JMM) 和 JVM 内存模型区别
    byType 和 byName 的区别
    Spring注入方式
    Java高性能编程-java基础-1.1.5线程通信
  • 原文地址:https://www.cnblogs.com/totoro-cat/p/13527804.html
Copyright © 2020-2023  润新知