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.hqwc.cn/news/413780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSL证书自动化管理有什么好处?如何实现SSL证书自动化?

SSL证书是用于加密网站与用户之间传输数据的关键元素,在维护网络安全方面,管理SSL证书与部署SSL证书一样重要。定期更新、监测和更换SSL证书,可以确保网站的安全性和合规性。而自动化管理可以为此节省时间,并避免人为错误和不必要…

google网站流量怎么获取?

流量是一个综合性的指标,可以说做网站就是为了相关流量,一个网站流量都没有,那其实就跟摆饰品没什么区别 而想从谷歌这个搜索引擎里获取流量,一般都分为两种方式,一种是网站seo,另一种自然就是投广告&#…

OpenEL GS之深入解析视频图像处理中怎么实现错帧同步

一、什么是错帧同步? 现在移动设备的系统相机的最高帧率在 120 FPS 左右,当帧率低于 20 FPS 时,用户可以明显感觉到相机画面卡顿和延迟。我们在做相机预览和视频流处理时,对每帧图像处理时间过长(超过 30 ms)就很容易造成画面卡顿,这个场景就需要用到错帧同步方法去提升…

Unity3D代码混淆方案详解

背景 Unity引擎使用Mono运行时,而C#语言易受反编译影响,存在代码泄露风险。本文通过《QQ乐团》项目实践,提出一种适用于Unity引擎的代码混淆方案,以保护代码逻辑。 引言 在Unity引擎下,为了防止代码被轻易反编译&a…

基于springboot+vue的房产销售系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

阿里云容器服务助力万兴科技 AIGC 应用加速

作者:子白(顾静) 2023 年堪称是 AIGC 元年,文生图领域诞生了 Stable Diffusion 项目,文生文领域诞生了 GPT 家族。一时间风起云涌,国内外许多企业投身 AIGC 创新浪潮,各大云厂商紧随其后纷纷推…

像操作本地文件一样操作linux文件 centos7环境下samba共享服务搭建详细教程

1.安装dnf yum -y install dnf 2.安装samba dnf install samba -y 3.配置 3.1创建并设置用户信息 #创建用户 useradd -M -s /sbin/nologin samba echo 123|passwd --stdin samba mkdir /home/samba chown -R samba:samba /home/samba smbpasswd -a samba smaba设置密码示…

安卓Android studio读写EM4305卡源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?id718720660087&spma1z10.5-c.w4002-21818769070.15.57dc6f89txUhXE <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xml…

【大数据】Flink 测试利器:DataGen

Flink 测试利器&#xff1a;DataGen 1.什么是 FlinkSQL &#xff1f;2.什么是 Connector &#xff1f;3.DataGen Connector3.1 Demo3.2 支持的类型3.3 连接器属性 4.DataGen 使用案例4.1 场景一&#xff1a;生成一亿条数据到 Hive 表4.2 场景二&#xff1a;持续每秒生产 10 万条…

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)

<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…

Cacti 前台SQL注入漏洞复现(CVE-2023-39361)

0x01 产品简介 Cacti 是一套基于 PHP,MySQL,SNMP 及 RRDTool 开发的网络流量监测图形分析工具。 0x02 漏洞概述 该漏洞存在于graph_view.php文件中。默认情况下,访客用户无需身份验证即可访问graph_view.php,在启用情况下使用时会导致SQL注入漏洞。 攻击者可能利用此漏洞…

spark dateformat源码排错

背景 有一个任务 yyyy写成了YYYY&#xff0c;导致年份不对触发告警 select from_unixtime(unix_timestamp(),YYYY-MM-dd HH:mm:ss) 第一时间用spark dateformat搜索下看看官网&#xff0c;发现spark 官网也没有描述YYYY的信息 Datetime patterns - Spark 3.5.0 Documentati…