首页 > 系统相关 >locust多进程实现分布式压测遇到的问题

locust多进程实现分布式压测遇到的问题

时间:2024-07-24 22:07:55浏览次数:17  
标签:web 压测 locust master 进程 HttpUser 分布式 FastHttpUser

多进程分布式的实现:

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更适合多进程情况

标签:web,压测,locust,master,进程,HttpUser,分布式,FastHttpUser
From: https://www.cnblogs.com/liuyanhang/p/18321868

相关文章

  • Locust 压测websocket协议
    Locust自带的HttpLocust类只支持http,并不支持websocket,但实现websocket压测只需要三步。1、第一步需要自己写一个websocketclient的类,实现连接、发送、接受、关闭连接等方法importwebsocketclassWebSocketClient(object):def__init__(self,host):self.hos......
  • Python 的分布式锁管理器
    我有一堆具有多个实例的服务器,这些实例访问的资源对每秒的请求有硬性限制。我需要一种机制来锁定所有正在运行的服务器和实例对此资源的访问。有我在github上找到的一个restful分布式锁管理器:https://github.com/thefab/restful-distributed-lock-manager不幸......
  • 【分布式锁】Redis实现分布式锁
    在分布式系统中,当多个服务实例(或节点)需要访问或修改同一份共享资源时,就需要使用分布式锁来确保数据的一致性和防止并发问题。这种情况下,传统的Java并发控制机制如ReentrantLock或synchronized就无法满足需求,因为它们是JVM级别的锁,只能保证单个JVM实例内部的线程同步,而无法......
  • 分布式训练并行策略
    1.分布式训练的概念分布式训练(DistributedTraining)是指将机器学习或深度学习模型训练任务分解成多个子任务,并在多个计算设备上并行地进行训练。一个模型训练任务往往会有大量的训练样本作为输入,可以利用一个计算设备完成,也可以将整个模型的训练任务拆分成子任务,分发给不......
  • 分布式系统中的Java应用:挑战与解决方案
    分布式系统中的Java应用:挑战与解决方案大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在分布式系统中使用Java的挑战与解决方案。分布式系统在处理大规模数据和高并发访问方面具有显著优势,但也面临诸多复杂性和挑战。本文将深入分析这些挑......
  • 实现高效的分布式日志收集与分析在淘客返利系统中的应用
    实现高效的分布式日志收集与分析在淘客返利系统中的应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将深入探讨如何在淘客返利系统中实现高效的分布式日志收集与分析。通过使用ELK(Elasticsearch、Logstash、Kibana)技术栈,我们可以有......
  • Apache压测工具ab(Apache Bench)工具的下载安装和使用示例
    场景Jmeter进行http接口压力测试:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124928498上面讲压测工具Jmeter的使用,下面介绍另外一个ab(ApacheBench)压测工具的使用。apachebenchapachebench是apache自带的压力测试工具。ab不仅可以对apache服务器进行网......
  • 服务远程调用-Open Feign-微服务核心组件【分布式微服务笔记04】
    服务远程调用-OpenFeign-微服务核心组件【分布式微服务笔记04】服务远程调用-OpenFeignOpenFeign最大的价值就是,在不同的微服务中可以相互调用对方的接口基本介绍OpenFeign是个声明式WebService客户端,使用OpenFeign让编写WebService客户端更简单使用方法:定义一个......
  • 【Locust】实现grpc接口性能测试
    一、locusthttps://www.locust.io/ 二、准备测试服务1、下载测试服务https://github.com/grpc/grpc.git2、使用编辑器或者IDE打开 3、proto文件位置 4、创建测试代码安装相关库pipinstalllocustgrpciogrpcio-toolspython-mgrpc_tools.protoc-I=/path......
  • 分布式环境下,如何实现 Session共享
    先了解一下为什么会出现这种session共享的解决方案?随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进......