压力测试一般用ab工具,ab就是apache bench,这个最常用,其他工具还有比如web bench等。
ab工具的安装方面,可以参考:)
压测的命令:
$ ab -c200 -n1600 https://www.baidu.com/
- -c 模拟200个客户端
- -n 总共多少次请求(1600)
- 还有其他参数比如-t,就是最大时间数,优先级比-n高
ab测试的结果:
...
Server Software: BWS/1.1
Server Hostname: www.baidu.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key: ECDH P-256 256 bits
TLS Server Name: www.baidu.com
Document Path: /
Document Length: 227 bytes
Concurrency Level: 200
Time taken for tests: 13.035 seconds
Complete requests: 1600
Failed requests: 0
Total transferred: 1777537 bytes
HTML transferred: 363200 bytes
Requests per second: 122.75 [#/sec] (mean)
Time per request: 1629.318 [ms] (mean)
Time per request: 8.147 [ms] (mean, across all concurrent requests)
Transfer rate: 133.18 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 164 1207 277.6 1307 1492
Processing: 36 231 270.1 95 1152
Waiting: 36 217 252.8 88 962
Total: 218 1438 95.8 1458 2604
上面的测试结果分析:
- 第一部分是基本信息,本次测试的基本情况;
- 第二部分是测试报告:
- Concurrency Level: 200 ——- 并发数
- Time taken for tests: 13.035 ——- seconds 总用时
- Complete requests: 1600 ——- 成功请求数
- Failed requests: 0 ——- 失败数
- Total transferred: 1777537 bytes ——- 总数据传输量
- HTML transferred: 363200 bytes ——- html数据量
- Requests per second(QPS): 122.75 [#/sec] (mean) ——- 每秒可以并发多少请求
- Time per request: 1629.318 [ms] (mean) ——- 每个请求的处理时间(用户平均请求等待时间)
- Time per request: 8.147 [ms] (mean, across all concurrent requests) ——- 服务器平均请求等待时间
- Transfer rate: 133.18 [Kbytes/sec] received ——- server的吞吐量(这些请求在单位时间内从服务器获取的数据长度)
参考:
QPS、Time per request、Transfer rate都是关注的指标。
服务器性能瓶颈要分析:
- CPU限制
- I/O限制,比如吞吐量大致等于网卡带宽,那瓶颈大致就是网络问题
- node程序的问题
PS:ab命令的其他参数
- -n 测试会话中所执行的请求个数,默认仅执行一个请求,如果不指定-t 参数,默认执行完所有请求后自动结束压测
- -c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个,此参数可以控制对服务器的单位时间内的并发量
- -t 测试所进行的最大秒数,默认为无时间限制….其内部隐含值是[-n 50000],它可以使对服务器的测试限制在一个固定的总时间以内,如果时间到了,请求个数还未执行完,也会被停止。
- -p 包含了需要POST的数据的文件,数据格式以接口请求参数定义的格式为准,eg. xxx.json #json 内容示例: {“name”:”小明”,”sex”:”男”}
- -T POST 数据所使用的Content-type头信息,指定请求参数格式,eg. application/json
- -r 在接口返回失败后,默认会终止压测,添加此参数后压测会继续进行
- -v 设置显示信息的详细程度
- -w 以HTML表格的形式输出结果,默认是白色背景的两列宽度的一张表
- -i 以HTML表格的形式输出结果,默认是白色背景的两列宽度的一张表-x 设置属性的字符串,此属性被填入[/table]-y 设置属性的字符串
- -z 设置[table]属性的字符串
- -C 对请求附加一个Cookie行,其典型形式是name=value的参数对,此参数可以重复
- -H 对请求附加额外的头信息,此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如”Accept-Encoding:zip/zop;8bit”)
- -A HTTP验证,用冒号:分隔传递用户名及密码
- -P 无论服务器是否需要(即是否发送了401认证需求代码),此字符串都会被发送
- -X 对请求使用代理服务器
- -V 显示版本号并退出
- -k 启用HTTP KeepAlive(长连接)功能,即在一个HTTP会话中执行多个请求,默认为不启用KeepAlive功能
- -d 不显示”percentage served within XX [ms] table”的消息(为以前的版本提供支持)
- -S 不显示中值和标准背离值,且均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息,默认会显示最小值/均值/最大值等(为以前的版本提供支持)
- -g 把所有测试结果写入一个’gnuplot’或者TSV(以Tab分隔的)文件
- -e 产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微秒为单位)时间
- -h 显示使用方法
- -k 发送keep-alive指令到服务器端