python - Locust:如何以编程方式使用分布式模式
问题描述
我正在使用 locust 加载测试一堆应用程序,问题是它使用了 90% 以上的 CPU,所以我想切换到 master 和 worker 的分布式模式,我知道它是如何在命令行中完成的,但我'm 使用 locust 作为库,似乎文档没有涵盖这种情况,这是我的代码的一些片段:
用户:
# host, port and reqs are external parameters
class User(HttpUser):
host = f"{host}/{port}"
@task
def task1(self):
for req in reqs:
self.client.request(req['method'],req['path'],name=f"{port}",headers=req['headers'],data=req['body'])
def on_start(self):
self.client.verify = False
主要:
env = Environment(user_classes=[User])
env.create_local_runner()
# env.create_web_ui("127.0.0.1", 8089)
gevent.spawn(stats_printer(env.stats))
gevent.spawn(stats_history, env.runner)
csvWriter = StatsCSVFileWriter(
environment=env,
base_filepath=f"{CWD}/outputs/{port}",
full_history=True,
percentiles_to_report=[0.5,0.6,0.7,0.8,0.9, 0.95, 0.99]
)
gevent.spawn(csvWriter)
env.runner.start(100, spawn_rate=5)
gevent.spawn_later(30,lambda: saveReportAndQuit(env,port))
env.runner.greenlet.join()
# env.web_ui.stop()
蟒蛇版本:3.9.7
蝗虫版本:2.4.0
解决方案
Locust 文档确实提到了这一点。他们没有完整的示例,当然,但是您应该从文档中获得所需的内容。
然后可以使用 Environment 实例的 create_local_runner、create_master_runner 或 create_worker_runner 来启动一个 Runner 实例,该实例可用于启动负载测试
create_worker_runner(master_host,master_port)
为此环境创建一个 WorkerRunner 实例
参数 master_host – 正在运行的主节点的主机/IP master_port – 主节点上要连接的端口
您需要在代码中知道主服务器的 IP 地址才能使用它,而 Locust 无法真正帮助您。但是你应该能够做这样的事情:
env = Environment(user_classes=[User])
env.create_worker_runner('0.0.0.0', 5557)
env.runner.greenlet.join()
我认为你不需要start
工人跑步者,因为主人应该告诉它你的测试何时开始,但我不是 100% 确定。试一试,看看会发生什么。
此外,如果您想为 master 和 worker 使用相同的文件,您将需要一些逻辑来决定该做什么。
推荐阅读
- powershell - 数据在 invoke-webrequest put 方法中作为 null 传递
- java - Gretty / Jetty 无法使用 java 11、Jetty 9.4.14、gretty 加载 WebAppContext
- java - 传递命令行参数来调用批处理作业
- android - 找不到 android.support.design.widget 类
- node.js - 为什么我的 onclick inPug 没有调用我的 js 函数?
- java - RecylerView 数据更新总是将焦点放在第一个项目上
- imagemagick - 如何在 Julia 中使用 libpng 来打包 ImageMagick?
- c# - 如果行没有数据 Asp.net c#,如何在 Gridview 中显示按钮链接
- visual-studio - 如何在正常的 PowerShell 会话(不在 Visual Studio 中)运行 Nuget PowerShell cmdlet Install-Package?
- node.js - 如何流式传输 API 响应而不是将其全部加载到 RAM 中