文章目录
Locust性能评测及优化详解
这篇文章是用来补前一篇文章挖的坑,在解析了Locust的整体流程之后,还是要回归落地,看看它到底好不好用,能不能用。
性能评测
在《性能测试工具Locust源码浅析》中,我们进行了一个主流程的分析。本次我们将对Locust进行实际的评测,在具体的评测之前,为了评测结果尽量的准确,我们需要做如下的规约:
- 服务器端没有性能瓶颈(假设有无限能力)
- 系统环境没有限制设定(网络连接数无限制,TIME_WAIT回收及时)
- 外部环境没有额外消耗(网络监控软件、限流软件没有启动)
- 网络带宽没有瓶颈
- 不同待评测工具在同一台机器上进行评测(中间预留足够的资源回收时间)
环境准备
1、压测环境准备
- 机器配置:4核8G
- 操作系统:CentOS(尽量选择Linux系统)
- 网络环境:千兆局域网
- 文件句柄数限制设定:65536
- socket连接回收时间:30ms
2、服务环境准备
- 服务端服务:nginx 8 worker挂载一个静态文件(hello world)
- 机器配置:4核8G
- 操作系统:CentOS(尽量选择Linux系统)
- 网络环境:千兆局域网
- 文件句柄数限制设定:65536
- socket连接设置:net.ipv4.tcp_tw_reuse=1,net.ipv4.tcp_timestamps=1,net.ipv4.tcp_tw_recycle=1,net.ipv4.tcp_fin_timeout = 30
3、压测工具准备
- Locust
- Jmeter
- ab
- http_load
压测开始
在同一套环境分别使用不同的工具来进行相同场景的请求,这里只发送一个请求hello world的静态文件。不同测试之间停留10分钟以上间隔,以保证2台机器各自资源的回收。
- CPU、内存
- Load Avg(系统队列长度)
- socket连接数
- Window Size(TCP窗口)
Locust
针对Locust先使用单实例进行压测,脚本中设置min_wait和max_wait均为0;由于Locust使用的是requests.session来发起请求,所以默认支持http的keep-alive;在单实例执行完成后,使用4实例来进行相同场景的压测。
具体的压测脚本如下:
from locust import HttpLocust, TaskSet, task
class WebsiteTasks(TaskSet):
@task
def index(self):
self.client.get("/")
class WebsiteUser(HttpLocust):
task_set = WebsiteTasks
host = "http://10.168.xx.xx"
min_wait = 0
max_wait = 0
启动Locust的命令如下:
# 单实例
locust -f performance.py --no-web -c 2 -r 2 -t 5s
# 分布式
locust -f performance.py --master
locust -f performance.py --slave
# 访问http://127.0.0.1:8089 启动压测
不同并发和实例的压测结果如下:
注:分布式场景下&