本文主要针对服务端, web 系统的性能测试.
性能测试
根据不同的测试目的, 性能测试具体细分为多种类型
基准测试 : 模拟单个用户访问系统的场景, 考察系统性能指标, 关注系统功能是否正常, 为其他压测提供基准参考.
负载测试: 模拟系统在正常压力下 (预期压力或者系统达到临界) 的负载能力, 判断是否满足业务需求.
压力测试 : 不断提升系统负载知道达到性能拐点, 寻找系统最大负载能力, 性能瓶颈等.
稳定性测试: 在一定压力下持续运行, 关注系统长期一定负载下是否能稳定服务.
以此获得系统在多少并发用户, 请求数的情况下, 平均响应时间, 成功失败率等数据.
在定位系统瓶颈时, 考虑被测系统 CPU, 网络, 磁盘, 缓存和数据库情况, 同时也要关注测试机器的情况.
这里介绍一种开源性能压测软件 locust, 纯 python 实现, 能实现模拟用户操作场景进行加压, 支持单进程和分布式多进程, 有一个简单 Web ui 查看压测过程, 而且开源 python, 方便自己自定义 hack.
安装
- pip install locustio
- locust --help
- pip install pyzmq ## 多进程机器部署需要安装
公司网络限制手动装依赖真是丢.....
注意 : 设置系统文件描述符最大限制 ulimit -n xx,
每一个 http 连接会打开一个文件描述符, 确保系统设置满足测试需求.
测试
参看官方文档, 简单地写一个测试例子, 对一个 oms 进行访问:
- #!/usr/bin/env python
- # coding=utf-8
- import JSON
- from locust import HttpLocust, TaskSet, task
- class WebsiteTasks(TaskSet):
- def on_start(self):
- response = self.client.get("/v1/games?developer=orientlu", catch_response = True)
- #print dir(response)
- result = JSON.loads(response.text)
- self.gameid = result[0]['gameid']
- @task(2)
- def get_unit(self):
- self.client.get("/v1/games?developer=orientlu&&gameid=%s"%(self.gameid))
- @task(1)
- def get_game(self):
- self.client.get("/v1/games?developer=orientlu")
- class WebsiteUser(HttpLocust):
- task_set = WebsiteTasks // 指向 TasSet 类, 定义测试行为
- host= "http://10.xx.xx.xxx:8099/"
- min_wait = 1000
- max_wait = 5000
例子中, WebsiteTasks 继承 TaskSet, 定义了测试行为, 定义 on_start 方法, locust 在模拟用户启动时调用执行一次, 诸如执行登录操作等;
定义执行任务, 通过 @task 修饰, 后续跟的数字为调用比重, 默认为 1, 虚拟用户运行期间, 按权重随机挑选任务执行, 然后根据设置的 min_wait/max_wait 区间随机休眠等待, 继续执行任务直到终止.
单进程运行
为了方便调试, 先在 no-Web 模式下执行, 看看脚本是否正常, 参数信息通过 locust -h 查看, 可以直接通过 print 打印调试.
$ locust -f locust_test.py --no-Web -c 1 -r 1 -t 10
确认脚本没有问题后, 通过 Web 模式执行测试,
$ $ locust -f locust_test.py -P 8899
启动 Web 后台后登录 Web, 设置模拟用户并发数和请求频率, 执行测试并查看测试情况
1533635778967.PNG
后台可见系统 http 连接数正在 rangup 中
1533630815709.PNG
1533630790693.PNG
多进程 / 分布式运行
执行压力测试时, 可能单个进程或者一台机器无法产生足够的压力, 此时需要多进程或者在多台机器上输出压力. 不管是多进程模式还是多机模式, 都需要先启动一个 master, 然后在启动多个 slaver.
启动 master, master 不输出压力, 需要指定 --master, Web 访问端口等参数.
$ locust -f ./locust_test.py --master -P 8899
启动 slaver, 同一台机器执行多次启动多个进程, 多机分布式通过在不同机器上执行命令, 需要指定 --slave 和 master 的 ip.
$ locust -f ./locust_test.py --slave --master-host=127.0.0.1
登录 Web 后可以查看当前启动的 slaver 数目.
1533636504819.PNG
基本 locust 上手测试就是如此了.
最后, 重点是, 他开源啊.
参考
- document
- https://github.com/locustio/locust
深入浅出开源性能测试工具 Locust(使用篇)
来源: http://www.jianshu.com/p/a97c3aec1551