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的压测.
在Locust中,HttpUser
和 FastHttpUser
是两种不同的用户行为模拟类,它们分别用于模拟不同的HTTP客户端行为。以下是这两种类的主要区别:
HttpUser
是Locust的基本HTTP用户模拟类,它使用requests
库来发送HTTP请求。HttpUser
支持多线程或多进程模式,具体取决于你的配置。requests
库的所有特性。requests
库本身是同步的,因此在高并发场景下,HttpUser
可能会导致较高的CPU使用率,尤其是当请求之间没有足够的等待时间时。HttpUser
适用于大多数HTTP负载测试场景,特别是那些对复杂性和灵活性有较高要求的测试。FastHttpUser
是一个较新的类,它使用httpx
库来发送HTTP请求,这是一个异步的HTTP客户端库。FastHttpUser
提供了更高的性能和更低的CPU使用率,因为它使用了异步I/O,可以在等待网络响应时执行其他任务。FastHttpUser
相对于HttpUser
来说,可能不支持requests
库的所有高级特性,但在大多数情况下,基本的功能如GET、POST请求等都是支持的。FastHttpUser
是一个很好的选择。requests
库的高级功能,那么HttpUser
可能更适合你。FastHttpUser
是一个更好的选择。以下是使用HttpUser
和FastHttpUser
的简单示例:
from locust import HttpUser, task, between
class MyHttpUser(HttpUser):
wait_time = between(1, 5)
@task
def my_task(self):
self.client.get("/some_endpoint")
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版本或者查阅官方文档。
总结: FastHttpUser更适合单进程下使用,HttpUser更适合多进程情况