Locust单机多核压测,以及主从节点的数据通信处理

一、背景

这还是2个月前做的一次接口性能测试,关于locust脚本的单机多核运行,以及主从节点之间的数据通信。

先简单交代下背景,在APP上线之前,需要对登录接口进行性能测试。经过评估,我还是优先选择了locust来进行脚本开发,本次用到了locust的单机多核运行能力,只不过这里还涉及到主从节点之间数据通信。现成的可参考的有效文档甚少,所以还是自己摸着官方文档过河比较靠谱。

顺带提一下,学习框架这种东西最好的教程其实还得是官方文档以及框架源码了,这里贴上locust官方文档链接,需要的可以自行学习:https://docs.locust.io/en/stable/what-is-locust.html

二、代码编写

其实脚本代码的编写一大重点就是如何处理测试数据,不同的测试需求对于测试数据的处理是不同的。比如这次的需求,手机号不能重复。另外考虑到长时间的负载压力,数据量还得足够。

最后测试数据还需要处理,那么我使用的测试号段是非真实号码段,测试结束后可以查询对应号段内的手机号,进行相关业务数据的清理。

1. 代码概览

还是老样子,先附上全部代码,然后对其结构进行拆分讲解。

import random
import time
from collections import deque

from locust import HttpUser, task, run_single_user, TaskSet, events
from locust.runners import WorkerRunner, MasterRunner

CURRENT_TIMESTAMP = str(round(time.time() * 1000))
RANDOM = str(random.randint(10000000, 99999999))
MOBILE_HEADER = {
    "skip-request-expired": "true",
    "skip-auth": "true",
    "skip-sign": "true",
    "os": "IOS",
    "device-id": "198EA6A4677649018708B400F3DF69FB",
    "nonce": RANDOM,
    "sign": "12333",
    "version": "1.2.0",
    "timestamp": CURRENT_TIMESTAMP,
    "Content-Type": "application/json"
}

last_mobile = ""
worker_mobile_deque = deque()


# 13300120000, 13300160000 新用户注册号段

@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
    if not isinstance(environment.runner, WorkerRunner):
        mobile_list = []
        for i in range(13300120000, 13300160000):
            mobile_list.append(i)
        mobile_list_length = len(mobile_list)
        print("列表已生成,总计数量:", mobile_list_length)
        worker_count = environment.runner.worker_count
        chunk_size = int(mobile_list_length / worker_count)
        print(f"平均每个worker分得的手机号数量:{chunk_size}")

        for i, worker in enumerate(environment.runner.clients):
            start_index = i * chunk_size
            if i + 1 < worker_count:
                end_index = start_index + chunk_size
            else:
                end_index = len(mobile_list)
            data = mobile_list[start_index:end_index]
            environment.runner.send_message("mobile_list", data, worker)


def setup_mobile_list(environment, msg, **kwargs):
    len_msg_data = len(msg.data)
    print(
### Locust 阶梯式实现方法及配置教程 Locust 是一种灵活的性能试工具,支持通过脚本化的方式实现复杂的场景。阶梯式是一种常见的模式,用于逐步增加负载以观察系统在不同力下的表现。以下是关于如何使用 Locust 实现阶梯式的详细说明。 #### 阶梯式的基本概念 阶梯式是指在试过程中逐步增加用户数量或请求速率,以模拟系统在不同负载下的表现。这种模式有助于识别系统的瓶颈和最大承载能力[^1]。 #### Locust 阶梯式的实现方法 ##### 1. 配置试脚本 Locust试脚本可以通过 `on_start` 和 `tasks` 方法定义用户的交互行为。以下是一个示例脚本,展示了如何模拟用户添加购物车、下单和付款的行为: ```python from locust import HttpUser, task, between class WebsiteUser(HttpUser): wait_time = between(1, 5) @task def add_to_cart(self): self.client.post("/add_to_cart", {"product_id": "123"}) @task def checkout(self): self.client.post("/checkout", {"cart_id": "456"}) @task def payment(self): self.client.post("/payment", {"payment_method": "credit_card"}) ``` ##### 2. 使用命令行参数设置阶梯式 Locust 提供了命令行参数来控制用户数量和孵化速率。通过调整这些参数,可以实现阶梯式的负载增加。例如,以下命令将每秒启动 10 个用户,直到达到 100 个用户: ```bash locust -f your_test_script.py --users 100 --spawn-rate 10 --host=http://your_target_host ``` - `--users 100`:最终启动的用户数量。 - `--spawn-rate 10`:每秒启动的用户数量。 为了实现阶梯式,可以通过多次运行上述命令并逐步增加用户数量和孵化速率来模拟不同的负载阶段[^2]。 ##### 3. 使用 Locust 的 API 进行自动化阶梯式 Locust 提供了一个 RESTful API 接口,允许通过编程方式控制试过程。以下是一个 Python 脚本示例,展示如何通过 API 实现阶梯式: ```python import time import requests base_url = "http://localhost:8089" # 启动 Locust 试 def start_locust(users, spawn_rate): response = requests.post(f"{base_url}/swarm", json={"user_count": users, "spawn_rate": spawn_rate}) return response.json() # 停止 Locust 试 def stop_locust(): response = requests.get(f"{base_url}/stop") return response.json() # 阶梯式逻辑 stages = [ {"users": 10, "spawn_rate": 5}, {"users": 20, "spawn_rate": 10}, {"users": 50, "spawn_rate": 15}, {"users": 100, "spawn_rate": 20} ] for stage in stages: print(f"Starting stage with {stage['users']} users at {stage['spawn_rate']} spawn rate...") start_locust(stage["users"], stage["spawn_rate"]) time.sleep(60) # 每个阶段持续 60 秒 print("Stage completed.") stop_locust() print("All stages completed.") ``` - 上述脚本通过调用 Locust 的 `/swarm` 和 `/stop` 接口,实现了自动化的阶梯式。 - 每个阶段的用户数量和孵化速率可以根据实际需求进行调整[^3]。 ##### 4. 结果分析与监控 在阶梯式过程中,可以通过 Locust 的 Web 界面实时查看性能指标,如响应时间、吞吐量和错误率等。此外,还可以结合外部监控工具(如 Prometheus 和 Grafana)对被系统的资源使用情况进行深入分析。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值