Locust:如何以编程方式使用分布式模式
Locust: How to use distributed mode programmatically
我正在使用 Locust 对一堆应用程序进行负载测试,问题是它使用了 90% 以上的 CPU 所以我想切换到主节点和工作节点的分布式模式,我知道它是如何在命令行中完成的,但我正在使用蝗虫作为一个库,而且文档似乎没有涵盖这种情况,这里是我的一些代码片段:
用户:
# 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()
python版本:3.9.7
蝗虫版本:2.4.0
Locust 文档 do in fact mention this. They don't have a full example, granted, but you should have what you need 从文档中做到这一点。
The Environment instance’s create_local_runner, create_master_runner or create_worker_runner can then be used to start a Runner instance, which can be used to start a load test
create_worker_runner(master_host, master_port)
Create a WorkerRunner instance for this Environment
Parameters
master_host – Host/IP of a running master node
master_port – Port on master node to connect to
您需要在代码中知道主人的 IP 地址才能使用它,Locust 无法真正帮助您。但是你应该能够做这样的事情:
env = Environment(user_classes=[User])
env.create_worker_runner('0.0.0.0', 5557)
env.runner.greenlet.join()
我认为您不需要 start
worker runner,因为 master 应该在您的测试开始时告诉它,但我不是 100% 确定。尝试一下,看看会发生什么。
此外,如果您要对主控和工作使用相同的文件,则需要一些逻辑来决定使用哪个。
我正在使用 Locust 对一堆应用程序进行负载测试,问题是它使用了 90% 以上的 CPU 所以我想切换到主节点和工作节点的分布式模式,我知道它是如何在命令行中完成的,但我正在使用蝗虫作为一个库,而且文档似乎没有涵盖这种情况,这里是我的一些代码片段:
用户:
# 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()
python版本:3.9.7
蝗虫版本:2.4.0
Locust 文档 do in fact mention this. They don't have a full example, granted, but you should have what you need 从文档中做到这一点。
The Environment instance’s create_local_runner, create_master_runner or create_worker_runner can then be used to start a Runner instance, which can be used to start a load test
create_worker_runner(master_host, master_port)
Create a WorkerRunner instance for this Environment
Parameters master_host – Host/IP of a running master node master_port – Port on master node to connect to
您需要在代码中知道主人的 IP 地址才能使用它,Locust 无法真正帮助您。但是你应该能够做这样的事情:
env = Environment(user_classes=[User])
env.create_worker_runner('0.0.0.0', 5557)
env.runner.greenlet.join()
我认为您不需要 start
worker runner,因为 master 应该在您的测试开始时告诉它,但我不是 100% 确定。尝试一下,看看会发生什么。
此外,如果您要对主控和工作使用相同的文件,则需要一些逻辑来决定使用哪个。