当前位置: 首页 > news >正文

locust快速入门--使用分布式提高测试压力

背景:

使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。

问题原因:

如果你是通过命令行启动的或者参考之前文章的启动方式:

  • 命令行: 在这里插入图片描述 在这里插入图片描述

  • locust 库方法:
    在这里插入图片描述`

因为create_local_runner会创建一个LocalRunner,这个runner只有一个WorkerNode
在这里插入图片描述
在这里插入图片描述

解决方式:

  • 单机:充分利用CPU每一个核心

    • os_start(True),指定参数True``则充分利用cpu的性能,否则就和之前调用create_local_runner一样。 使用os、multiprocessing完成, 模拟的是命令行启动locust的操作.。
    • local_start(True),使用locust的库方法,根据CPU的核心数、线程数创建WorkerNode
  • 多机:利用多台机器的能力提高测试压力

    • slave_start(master_ip, master_port=5557),指定主机的IP及端口号。
    # -*- coding:UTF-8 -*-"""@ProjectName  : pyExamples @FileName     : locust_demo@Description  : @Time         : 2024/1/4 下午11:30@Author       : Qredsun"""
    import os
    import socket
    import psutil
    from multiprocessing import Process
    from locust import HttpUser, events, task, between
    from locust.env import Environmentclass UserRun(HttpUser):wait_time = between(min_wait=0.1, max_wait=0.2)  # 设置task运行间隔@task  # 装饰器,说明下面是一个任务def getuser_(self):url = 'https://analytics.cnblogs.com/api/v1/reports'  # 接口请求的URL地址payload = {"blogId": 485117, "postId": 10365033,"url": "https://www.cnblogs.com/happyyangyanghappy/p/10365033.html", "resolution": "1920x1080","referrer": "https://www.ecosia.org/", "createdAt": "2024-01-04T16:17:52.241Z"}with  self.client.post(url, json=payload, catch_response=True) as rsp:if rsp.status_code == 200:rsp.success()else:rsp.failure(f'接口调用失败:{rsp.json()}')def current_ip():ip = Noneinterfaces = psutil.net_connections(kind='inet4')for interface in interfaces:if interface.type == socket.SocketKind.SOCK_STREAM and interface.status is not None and bool(interface.raddr):if interface.raddr.ip != "127.0.0.1":print(interface.laddr.ip)ip = interface.laddr.ipbreakreturn ipdef local_start(multiprocess=False, master_ip=None):# 使用locust库启动web_host = current_ip()web_port = 8089runners = []master_env = Environment(user_classes=[UserRun], events=events)if multiprocess:# 主节点master_ip = web_hostmaster_port = 5557master_runner = master_env.create_master_runner(master_bind_host=master_ip, master_bind_port=master_port)# 工作节点数量process_num = psutil.cpu_count()# slavefor _ in range(process_num):env = Environment(user_classes=[UserRun], events=events)slave_runner = env.create_worker_runner(master_host=master_ip, master_port=master_port)runners.append(slave_runner)else:master_runner = master_env.create_local_runner()runners.append(master_runner)web_ui = master_env.create_web_ui(host=web_host, port=web_port)runners.append(web_ui)master_env.events.init.fire(environment=master_env, runner=master_runner, web_ui=web_ui)for runner in runners:runner.greenlet.join()def os_start(multiprocess=False):# 使用os库启动web_host = current_ip()web_port = 8089master_ip = web_hostmaster_port = 5557master_cmd = f"locust -f {os.path.basename(__file__)}  --web-host {web_host} --web-port {web_port} --run-time 180s"process_num = psutil.cpu_count(logical=True)process_list = []if multiprocess:if os.name == "nt":# Windows 系统master_cmd += f" --master --master-bind-host {master_ip} --master-bind-port {master_port}"process_list.append(Process(target=os.system, args=(master_cmd,)))slave_cmd = f"locust -f {os.path.basename(__file__)}  --worker --master-host {master_ip} --master-port {master_port}"for _ in range(process_num):process_list.append(Process(target=os.system, args=(slave_cmd,)))else:# linuxmaster_cmd += f" --master-host {master_ip} --master-port {master_port} --processes -1"process_list.append(Process(target=os.system, args=(master_cmd,)))else:process_list.append(Process(target=os.system, args=(master_cmd,)))for p in process_list:p.start()for p in process_list:p.join()def slave_start(master_ip, master_port=5557):# 使用locust库启动runners = []# 工作节点数量process_num = psutil.cpu_count()# slavefor _ in range(process_num):env = Environment(user_classes=[UserRun], events=events)slave_runner = env.create_worker_runner(master_host=master_ip, master_port=master_port)runners.append(slave_runner)for runner in runners:runner.greenlet.join()if __name__ == '__main__':# os_start(True)local_start(True)

工作效果:

在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/281441.html

相关文章:

  • K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略
  • 免费的域名要不要?
  • 高通sm7250与765G芯片是什么关系?(一百八十一)
  • [Python进阶] Python操作MySQL数据库:pymysql
  • Vue3实现带点击外部关闭对应弹出框(可共用一个变量)
  • 可视化试题(一)
  • RHCE 【在openEuler系统中搭建基本论坛(网站)】
  • 20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】
  • 日志采集传输框架之 Flume,将监听端口数据发送至Kafka
  • 关于Vue前端接口对接的思考
  • 【设计模式之美】SOLID 原则之三:里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定
  • 代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛
  • Docker 项目如何使用 Dockerfile 构建镜像?
  • 实践学习PaddleScience飞桨科学工具包
  • Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式
  • 达梦数据库主备集群
  • Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决
  • 深入理解 go chan
  • java+vue基于Spring Boot的渔船出海及海货统计系统
  • Linux第25步_在虚拟机中备份“ST官方的TF-A源码”
  • 统计学-R语言-4.1
  • C++(1) —— 基础语法入门
  • 构建基于RHEL8系列(CentOS8,AlmaLinux8,RockyLinux8等)的支持63个常见模块的PHP8.1.20的RPM包
  • Vue-插槽(Slots)
  • 新火种AI|GPT-5前瞻!GPT-5将具备哪些新能力?
  • 安防视频监控系统EasyCVR设备分组中在线/离线数量统计的开发与实现
  • spring cloud之集成sentinel
  • 让车辆做到“耳听八方”,毫米波雷达芯片与系统设计
  • Python如何实现数据驱动的接口自动化测试
  • 高级分布式系统-第15讲 分布式机器学习--联邦学习