开发完了自己的服务器,是不是想知道他的响应速度够不够快、有多抗压、能承受多大的访问量呢?嗯,没错,我也很好奇,所以这两天玩了玩测试的东西,这里给大家分享一下。
Artillery
想做压力测试当然要有相应的工具,于是第一步我就去 npm 上搜了一下,结果发现工具挺多,可惜的是大部分都已经停止更新和维护了,而目前还在维护的并有一定使用者的发现了 loadtest 和 artillery 这两个,最后选择了 star 数最多的 artillery (其作者目前很积极,差不多每条 issue 都有人回答吧)实战一下。
安装:
npm install -g artillery
测试:
artillery quick --duration 30 --rate 10 -n 20 https://artillery.io
测试时长 30 s,每秒 10 条请求,20 个用户,测试了下 artillery 自己的官网。
看看下图的结果:
总共 30*10*20 = 6000 次请求,没错,全部正常完成,如果有错误发生或丢包等情况会在最后提示,请求到响应的时间消耗也很明显的可以看出来,min、max、median、p95、p99分别表示最小、最大、平均、完成95%、完成99%请求或发出请求到响应完成的时间长度,最后本次测试的记录也会在当前工作目录下自动生成一个 json 文件。
更多配置亦可编写 yml 文件然后直接执行此文件,感兴趣的话可以去官网看看详细的资料,这里之所以不再赘述是因为我更喜欢另一种测试工具。
ab
好吧,我承认向传统势力低头了,ab 就是 apache 的一款测试工具,历史也算是很悠久了。
安装:
MacOS 自带,不用安装,其它系统怎么安装?嘿,我管不着,谁让我是用 Mac 的人。
测试:
ab -c 1000 -t 10 https://baidu.com/
并发数 1000,测试时间 10 s,没错测测百度玩玩。
看看下图的结果:
好吧,感觉每条数据都有价值。
- Concurrency Level: 并发数
- Time taken for tests: 测试所用时间
- Complete requests: 完成的请求
- Failed requests: 失败的请求
- Requests per second: 吞吐量=完成的请求/测试所用时间
- Time per request: 两个名称相同,第一个表示完成整个请求平均时间
- Time per request: 第二个表示服务器处理请求的平均响应时间
后面一堆百分比表示完成这个比例的请求所花费的时间。
吞吐量越大服务器性能越好,当然这与硬件有很大的关系,至于请求相关的时间当然是越短越好。
测试完了发现 ab 的数据更整洁,另外 ab 的测试结果可以通过 -w 指定位置输出 html 格式的静态文件,当然更多测试相关的参数设置还是参考官网吧。
ab 的并发数设置问题
如果你在测试的时候并发数设置的较大,那么你可能会碰到这种问题:
socket : Too many open files(24)
这是因为系统本身默认的 open files 数值过小导致的,可以通过以下指令修改:
ulimit -n 10000
这里设置为10000(必须比系统允许的最大值小)。
怎么查看系统的最大值:
$ sysctl kern.maxfiles $ sysctl kern.maxfilesperproc
如果最大值你还嫌小的话,也可以配置(数值自己设置即可,这里只是示例):
$ sudo sysctl -w kern.maxfiles=1048600 $ sudo sysctl -w kern.maxfilesperproc=1048576
压力测试对分析性能瓶颈还是很有帮助的,关于测试就写这么多吧