资讯详情

资讯详情

Locust 快速上手:编写第一个 Locustfile、运行负载测试并解读瓶颈结果

Locust 快速上手编写第一个 Locustfile、运行负载测试并解读瓶颈结果【免费下载链接】locustWrite scalable load tests in plain Python 项目地址: https://gitcode.com/gh_mirrors/lo/locust本文基于 Locust 官方文档 quickstart 展开带你走完一个完整闭环编写第一个基于HttpUser的 Python 负载测试文件通过 Web UI 或 headless 命令行方式发起压测并学会从 RPS、响应时间等指标中识别目标系统的瓶颈。读完后你可以独立编写可运行的 Locustfile熟练使用--headless、--users、--spawn-rate、-H等核心参数并具备初步解读压测图表的能力。一、编写第一个 Locust 测试一个 Locust 测试本质上就是一个向被测系统发起请求的 Python 程序。这种设计让它既能做简单测试也特别擅长实现复杂的用户流程。最小示例如下from locust import HttpUser, task class HelloWorldUser(HttpUser): task def hello_world(self): self.client.get(/hello) self.client.get(/world)这个 User 会先请求/hello再请求/world然后循环往复。把/hello、/world换成你网站/服务上的真实路径将代码保存为当前目录下的locustfile.py即可运行。1.1 源码视角task与任务调度是如何工作的这个极简示例背后有一套清晰的任务收集与调度机制理解它有助于写出正确的 Locustfile任务收集task装饰器见 task.py会在使用方法上写入locust_task_weight属性不传参时权重默认为 1。HttpUser的父类User使用元类UserMeta在类定义时调用get_tasks_from_base_classes把本类与基类上所有带权任务收集进tasks列表权重为 N 的任务会被重复加入 N 次以此实现概率加权task.py。任务选择运行时的根任务集DefaultTaskSet每次通过random.choice(self.user.tasks)随机抽取一个任务执行task.py。也就是说一个 User 的多个task方法之间是随机轮转而非固定顺序的只有方法内部如上面的hello_world是顺序执行。任务间隔每执行完一个任务TaskSet.run()会调用wait()睡眠wait_time秒后再调度下一个任务task.py、task.py。User的默认值是wait_time constant(0)users.py所以 quickstart 这个例子中的用户会不间断地连续发请求这正是一个用户能贡献最大请求速率的情形。若想让行为更像真人可以改用between(2, 5)这类写法仓库示例 basic.py 就展示了带wait_time between(2, 5)与TaskSet的完整用户from locust import HttpUser, TaskSet, between, task class WebsiteUser(HttpUser): host http://127.0.0.1:8089 wait_time between(2, 5) tasks [UserTasks]host 是必填项HttpUser.__init__中如果host属性、类属性和命令行都没有提供会直接抛出StopTestusers.pyYou must specify the base host. Either in the host attribute in the User class, or on the command line using the --host option.host 有三种提供方式写在 User 类的host属性上、命令行-H/--host、或在 Web UI 的 swarm 表单中填写。三者任选其一即可。二、运行 locustWeb UI 模式在locustfile.py所在目录执行$ locust [2021-07-24 09:58:46,215] .../INFO/locust.main: Starting web interface at http://0.0.0.0:8089 [2021-07-24 09:58:46,285] .../INFO/locust.main: Starting Locust |version|入口链路是locust可执行命令 →main.py 调用main()→ main.py 依次完成查找并导入 locustfile、解析全部命令行参数、创建Environment/Runner最后启动 Web 服务并打出Starting web interface at ...日志main.py。然后打开浏览器访问http://localhost:8089端口 8089 是--web-port短选项-P的默认值argument_parser.py--web-host默认为绑定所有网卡*所以日志里显示0.0.0.0:8089若 User 类没有声明host需要在页面上提供被测服务器地址。按下 Start swarming 后页面会实时展示聚合统计。以下截图展示的是用 50 个并发用户、每秒 1 个用户 ramp up 运行该测试时的样子Statistics 表格按 URL 维度展示请求数、失败数、平均/最小/最大/中位响应时间、req/s 与 failures/sCharts 标签页请求速率RPS、响应时间分布、当前运行用户数等随时间变化的曲线。2.1 如何识别瓶颈读懂图表注解读性能测试结果相当复杂超出本手册范围。但如果你的图表开始出现下文的形态说明目标系统扛不住当前负载——你找到了一个瓶颈。从截图可以看到当用户数升到20 左右时响应时间开始急剧上涨尽管 Locust 还在继续生成更多用户RPS 却不再增长——目标服务已经过载/饱和。如果响应时间没有上涨那就继续加压用户数直到找到服务崩溃点或者确认你的服务在预期负载下性能已经足够如果感觉发不出足够的负载来打满系统可以看 增加请求速率 文档寻找方案。如果你想在自己的环境里复现这张瓶颈图仓库提供了现成脚本 bottlenecked_server.py它用Semaphore(10)限制同一时刻最多 10 个并发请求、每个请求time.sleep(1)模拟一个只有 10 个工作线程的慢服务器并挂载在 Locust 自己的 Web UI 上供测试sema Semaphore(10) class WebsiteUser(HttpUser): host http://127.0.0.1:8089 task def index(l): l.client.get(/slow)运行它即可在 UI 中观察到用户数持续增加但 RPS 封顶、响应时间线性恶化的典型饱和曲线。三、Headless 模式命令行直接运行Web UI 完全是可选的。你可以在命令行直接给负载参数并以文本形式获得结果报告$ locust --headless --users 10 --spawn-rate 1 -H http://your-server.com [2021-07-24 10:41:10,947] .../INFO/locust.main: No run time limit set, use CTRLC to interrupt. [2021-07-24 10:41:10,947] .../INFO/locust.main: Starting Locust |version| [2021-07-24 10:41:10,949] .../INFO/locust.runners: Ramping to 10 users using a 1.00 spawn rate Name # reqs # fails | Avg Min Max Median | req/s failures/s ------------------------------------------------------------------------------ GET /hello 1 0(0.00%) | 115 115 115 115 | 0.00 0.00 GET /world 1 0(0.00%) | 119 119 119 119 | 0.00 0.00 ------------------------------------------------------------------------------ Aggregated 2 0(0.00%) | 117 115 119 117 | 0.00 0.00 (...) [2021-07-24 10:44:42,484] .../INFO/locust.runners: All users spawned: {HelloWorldUser: 10} (10 total users) (...)命令中的每个参数都能在 argument_parser.py 中找到定义核心几项如下参数短选项含义备注--headless—禁用 Web UI 并立即开始测试环境变量LOCUST_HEADLESS--users-u峰值并发用户数主要与--headless/--autostart配合使用测试中也可用键盘w/W/s/S增删 1/10 个用户--spawn-rate-r每秒生成用户的速率浮点数spawn 速率超过 100 时 Runner 会给出警告runners.py--host-H被测主机格式https://www.example.com环境变量LOCUST_HOST--run-time-t运行时长如300s、20m、1h30m仅配合 headless/autostart 使用默认无限期运行用 CTRLC 中断--locustfile-f测试文件路径默认locustfile.py支持逗号分隔多文件、包目录或 URL--web-port-PWeb UI 端口默认 8089两点源码层面的说明上面日志里的 Ramping to 10 users using a 1.00 spawn rate 是文档当时的输出格式当前源码中该行日志的措辞是Ramping to %d users at a rate of %.2f per secondrunners.pyAll users spawned: {...} 格式保持不变runners.py。不设置--run-time时会打印 No run time limit set, use CTRLC to interrupt.该行为在 test_main.py 的集成测试中有断言验证。此外与 headless 输出/报告相关的选项同样定义在 argument_parser.py包括--html file输出 HTML 报告、--json/--json-file以 JSON 输出最终统计配合--skip-log可只输出 JSON、--csv周期性写 CSV、--only-summary只打印最终汇总、--reset-stats在 spawn 完成后重置统计等适合接入 CI。更多 headless 细节见 无 Web UI 运行。四、更多选项分布式运行要跨多个 Python 进程或机器运行 Locust先启动一个带--master参数的 master 进程再启动任意数量带--worker参数的 worker 进程。master 还可以用--expect-workers/--expect-workers-max-wait控制等待 worker 就绪的策略argument_parser.py 中 master 参数组。详细说明见 分布式运行。查看全部选项执行locust --help或参考 配置文档每个命令行参数都支持同名环境变量与配置文件如LOCUST_USERS。列出用户类-l/--list可打印 locustfile 中所有可选的 User 类后退出argument_parser.py多个用户类时可配合--users-per-user-class在命令行中指定分配。五、小结与下一步一个最小 Locustfile 只需一个继承HttpUser的类加task方法任务的收集、加权随机调度与wait_time间隔都由User/TaskSet元类与TaskSet.run()循环驱动默认locust命令启动 Web UI0.0.0.0:8089可交互地设置 host、用户数与 spawn ratelocust --headless -u N -r R -H host是无界面生产/CI 用法输出周期性统计表与最终汇总学会看 RPS 与响应时间的拐点是判断瓶颈的第一步发不出足够压力时参考 增加请求速率。下一步深入阅读 locustfile 的完整写法编写 Locust 测试。【免费下载链接】locustWrite scalable load tests in plain Python 项目地址: https://gitcode.com/gh_mirrors/lo/locust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →