多进程分布式的实现:

locust分布式时,需借助命令locust 一个一个启动worker,在使用中有点繁琐,

下面借助于多进程,按既定worker数量,一键启动;


from locust import FastHttpUser, task, User, events, HttpUser #class WebsiteUser(FastHttpUser): 错误的使用!!!
class WebsiteUser(HttpUser): #正确的使用
tasks = [TaskSet]
host = "https://www.baidu.com"
wait_time = between(0, 0) def processFun(cmd):
os.system(cmd) def start_by_process(tst_locust_file, slave_num, master_host='127.0.0.1', locust_web_port=8090, no_web=False,
user_num=10, user_rate=1, result_log='result.log', run_log='run.log'):
p_lst = []
if no_web:
slave_cmd = f"locust -f {tst_locust_file} --worker --master-host={master_host}"
master_cmd = f"locust -f {tst_locust_file} --headless -u {user_num} -r {user_rate} --master"
else:
slave_cmd = f"locust -f {tst_locust_file} --worker --master-host={master_host}"
master_cmd = f"locust -f {tst_locust_file} --web-host {master_host} --web-port {locust_web_port} --master"
master_cmd += f' --logfile {result_log} --loglevel INFO 1>{run_log} 2>&1'
# 启动master
process_master = multiprocessing.Process(target=processFun, args=(master_cmd,))
process_master.start()
p_lst.append(process_master)
# 启动 worker
for index_num in range(slave_num):
process = multiprocessing.Process(target=processFun, args=(slave_cmd,))
process.start()
p_lst.append(process) # 阻塞等待
for process in p_lst:
process.join() if __name__ == "__main__":
tst_locust_path = 'wms/wms_test'
slave_num = 3 # 计划所启动worker数量, 不可超过运行机的CPU数量
master_host = '127.0.0.1'
master_host = '192.168.1.102'
locust_web_port = 8099 # locust web页面挂载端口
no_web = False
tst_locust_file = os.path.basename(__file__) # 本脚本名
os.chdir(os.getcwd().replace(tst_locust_path.replace('/', os.sep), ''))
tst_locust_file = f'{tst_locust_path}/{tst_locust_file}'
start_by_process(tst_locust_file, slave_num, master_host, locust_web_port, no_web=no_web)

问题:

在上述代码中,我使用了class WebsiteUser(FastHttpUser): 错误的使用!!!这个方式,来使用locust的User类,当执行压测时,work会因CPU过高而miss掉,导致压测终止.当切换成class WebsiteUser(HttpUser): #正确的使用时,可以正常执行locust的压测.

HttpUser和FastHttpUser介绍:

在Locust中,HttpUserFastHttpUser 是两种不同的用户行为模拟类,它们分别用于模拟不同的HTTP客户端行为。以下是这两种类的主要区别:

HttpUser

  • HttpUser 是Locust的基本HTTP用户模拟类,它使用requests库来发送HTTP请求。
  • HttpUser 支持多线程或多进程模式,具体取决于你的配置。
  • 它提供了丰富的功能和灵活性,包括支持重试、会话管理、以及使用requests库的所有特性。
  • 由于requests库本身是同步的,因此在高并发场景下,HttpUser可能会导致较高的CPU使用率,尤其是当请求之间没有足够的等待时间时。
  • HttpUser适用于大多数HTTP负载测试场景,特别是那些对复杂性和灵活性有较高要求的测试。

FastHttpUser

  • FastHttpUser 是一个较新的类,它使用httpx库来发送HTTP请求,这是一个异步的HTTP客户端库。
  • FastHttpUser 提供了更高的性能和更低的CPU使用率,因为它使用了异步I/O,可以在等待网络响应时执行其他任务。
  • 它特别适合于高并发的场景,可以显著减少CPU使用率,尤其是在大量并发用户的情况下。
  • FastHttpUser 相对于HttpUser来说,可能不支持requests库的所有高级特性,但在大多数情况下,基本的功能如GET、POST请求等都是支持的。
  • 如果你的目标是进行大规模并发测试,同时保持较低的CPU使用率,FastHttpUser是一个很好的选择。

总结

  • 如果你的测试场景需要高度定制化的请求设置或者你已经在使用requests库的高级功能,那么HttpUser可能更适合你。
  • 如果你希望在高并发场景下减少CPU使用率,并且能够接受一定的功能限制,那么FastHttpUser是一个更好的选择。

示例

以下是使用HttpUserFastHttpUser的简单示例:

HttpUser 示例

from locust import HttpUser, task, between

class MyHttpUser(HttpUser):
wait_time = between(1, 5) @task
def my_task(self):
self.client.get("/some_endpoint")

FastHttpUser 示例

from locust import FastHttpUser, task, between

class MyFastHttpUser(FastHttpUser):
wait_time = between(1, 5) @task
def my_task(self):
self.client.get("/some_endpoint")

请注意,在使用FastHttpUser时,你需要确保你的Locust版本支持该类。如果不确定,可以检查你的Locust版本或者查阅官方文档。

原因分析:

  1. 异步I/O与多进程的交互:
  • FastHttpUser使用httpx库来进行异步HTTP请求,而httpx是基于trio或anyio的异步I/O库。
  • 在多进程环境下,每个进程都有自己的事件循环,这可能导致每个进程中的异步I/O操作无法有效地与其他进程协调,从而增加了CPU的负担。
  1. 多进程与异步I/O的兼容性:
  • 多进程模式下,每个进程都有独立的内存空间和事件循环,这可能意味着每个进程都在单独运行其事件循环,而不是共享一个全局的事件循环。这种情况下,每个进程都在尝试同时执行大量的异步任务,可能会导致CPU使用率上升。
  1. 事件循环的调度:
  • 在FastHttpUser中,每个进程可能有自己的事件循环,而在多进程模式下,这些事件循环可能没有被有效地调度,导致CPU使用率增加。
  • httpx的异步特性通常在单进程中表现更好,因为它可以充分利用事件驱动模型的优势,但在多进程环境下,每个进程都需要维护自己的事件循环,这可能会导致额外的开销。
  1. 并发模型的不匹配:
  • FastHttpUser的设计初衷是为了利用异步I/O的优势来提高性能,特别是在高并发场景下。然而,在多进程模式下,这种优势可能会因为进程间的隔离和通信开销而被抵消。

总结: FastHttpUser更适合单进程下使用,HttpUser更适合多进程情况

locust多进程实现分布式压测遇到的问题的更多相关文章

  1. 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统

    王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...

  2. jmeter分布式压测

    stop.sh需要跑Jmeter的服务器上安装Jmeteryum install lrzsz 安装rz.sz命令rz jemter的压缩包 拷贝到/usr/local/tools下面unzip apa ...

  3. jmeter 分布式压测(Linux)

    之前一篇博文写的是如何在Linux上使用jmeter压测,这篇介绍下Linux上jmeter的分布式压测. 和windows上的分布式类似,需要配置agent节点和控制机 一.Agent节点配置 1. ...

  4. jmeter 分布式压测(windows)

    单台压测机通常会遇到客户端瓶颈,受制于客户机的性能.可能由于网络带宽,CPU,内存的限制不能给到服务器足够的压力,这个时候你就需要用到分布式方案来解决客户机的瓶颈,压测的结果也会更加接近于真实情况. ...

  5. Jmeter 在linux下的分布式压测

    Jmeter 在linux下的分布式压测 0.将 windows机器作为master 控制机(同时也兼做负载机slave), linux机器作为 负载机 slave. 1.linux环境安装 : (1 ...

  6. 分布式压测系列之Jmeter4.0第一季

    1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...

  7. JMeter在linux上分布式压测步骤(二)

    哈喽,我又来了~ 前提:三台linux虚拟机,一台作为master,另外两台作为slave. 一.server端 1.修改1099端口,client和server通信的端口,可以不修改,默认就是109 ...

  8. jmeter实现分布式压测步骤

    环境说明:安装与控制机相同版本的jdk与jmeter 1.修改控制机中的jmeter.properties文件 将<remote_hosts=127.0.0.1>改为<remote_ ...

  9. Linux环境下进行分布式压测踩过的坑

    背景:公司为了满足大并发的情况,需要测试组配合,就需要分布式压测,这里我把我踩过坑都记录下来: 环境:Linux + jmeter-v.5.1.1;使用3台2核4G的压力机: Q1: Server f ...

  10. jmeter5.1分布式压测

    在使用jmeter压测过程中,可能会度遇到内存溢出的错误,这是为什么呢?因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,但是单机无法支 ...

随机推荐

  1. Qt-FFmpeg开发-保存视频流裸流(11)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 1.概述 2.实现效果 3.FFmpeg保存裸流代码流 ...

  2. MYSQL 移机重装步骤(windows11)

      MYSQL 移机重装步骤(windows11)   目的:已有电脑 A,D盘安装有mysql(安装方式为免安装) , 准备在另一台电脑B上,复制安装电脑A上的mysql(8.0.23版本) . 要 ...

  3. 从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

    本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...

  4. 第一次至第三次PTAJava大作业分析

    (1)前言: 三次题目集的知识点: 正则表达式(Regular Expression,简称Regex或RegExp)是一个强大的文本处理工具,用于匹配.查找和替换字符串.以下是正则表达式的主要知识点总 ...

  5. linux系统下,安装redis教程,以redis 6.2.6为例

    1.下载安装包 手动下载:进入官网选择下载版本https://download.redis.io/releases/ 命令下载: cd /usr/local wget http://download. ...

  6. LangChain让LLM带上记忆

    最近两年,我们见识了"百模大战",领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆. 在对话中,无法记住上下文的 LLM 常常会让用户感到困扰.本文探讨如 ...

  7. AIGC底层技术介绍

    1.AIGC概述 AIGC,全称Artificial Intelligence Generated Content,即人工智能生成内容.这是一种新兴的人工智能技术,其核心思想是利用人工智能模型,根据给 ...

  8. 解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展

    解锁LLMs的"思考"能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展 1.简介 Chain-of-Thought(CoT)是一种改进的Prompt技术, ...

  9. Linux下挂载NTFS格式的U盘

    NTFS是Windows下的格式,在Linux下是识别不了的,要想在Linux上挂载NTFS格式的U盘需要安装软件以提供支持.软件名为ntfs-3g. 1.下载安装包 https://tuxera.c ...

  10. ffmpeg 学习:主要结构体之间关系

    背景 学习例程源码的时候,搞不清楚各结构体之间是什么含义. 解析 FFmpeg 有多个重要的结构体,解协议,解分装,解码,解封装. 解协议: http,rstp,rtmp,mms. AVIOConte ...