hey是一款golang编写的开源压测工具。本文主要介绍其功能,结果展示,以及对其功能的深入思考。
http://github.com/rakyll/hey
hey [options] url
参数 | 解释 |
-n | 总请求数目 |
-c | 并发数目 |
-q | 单个work的qps |
-z | 持续时常,和-n参数可以选择一个使用 |
-o | 输出格式,支持标准和csv两种格式 |
-m | HTTP method |
-H | 自定义的请求头 |
-t | 超时时间 |
-d | http body |
-D | http body文件地址 |
-a | Basic authentication |
-x | http代理地址 |
-h2 | 开启HTTP/2 |
-disable-compression | Disable compression. |
-disable-keepalive | Disable keep-alive, prevents re-use of TCP connections between different HTTP requests. |
-disable-redirects | Disable following of HTTP redirects |
-cpus | 使用cpu资源数目 |
服务启动多个线程并发的去发送请求,记录返回状态,输出统计结果
命令 -- 发送1000个请求,启动5个线程并发发送,使用post方法,单worker的qps为10,请求body所在的文件是/Users/didi/test/body.txt,添加请求头“Method:Test”,请求url是http://127.0.0.1:8001/v1/activity/bus/maas?actid=bus_8
hey -n 1000 -c 5 -H Method:Test -m POST -q 10 -D /Users/didi/test/body.txt "http://127.0.0.1:8001/v1/activity/bus/maas?actid=bus_8"
结果展示
Summary:
Total: 20.0067 secs 总时间开销
Slowest: 0.0286 secs。最慢请求的延迟时间
Fastest: 0.0003 secs。最快请求的延迟时间
Average: 0.0012 secs。平均请求的延迟时间
Requests/sec: 49.9834 平均qps
Total data: 7000 bytes response body总共接收到字节数
Size/request: 7 bytes。 平均每条请求response body接收到的字节数
Response time histogram: 延迟分布柱状图
0.000 [1] |
0.003 [993] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.006 [1] |
0.009 [0] |
0.012 [2] |
0.014 [0] |
0.017 [0] |
0.020 [0] |
0.023 [0] |
0.026 [0] |
0.029 [3] |
Latency distribution: 延迟分布区间
10% in 0.0007 secs
25% in 0.0010 secs
50% in 0.0012 secs
75% in 0.0013 secs
90% in 0.0014 secs
95% in 0.0015 secs
99% in 0.0021 secs
Details (average, fastest, slowest): 不同步骤的延迟情况
DNS+dialup: 0.0000 secs, 0.0003 secs, 0.0286 secs
DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs
req write: 0.0001 secs, 0.0000 secs, 0.0012 secs
resp wait: 0.0010 secs, 0.0002 secs, 0.0204 secs
resp read: 0.0001 secs, 0.0000 secs, 0.0006 secs
Status code distribution: response code的分布情况
[200] 1000 responses
压测的统计结果还是挺丰富的。个人觉得Details这个模块的数据特别有用,它把请求延迟进一步做了细分。
答:没有关系,cpu核数表示实际使用的cpu最大资源数,worker数据表示并发地发送请求的数据。比如如果设置c=5,q=10,它表示会启动5个协程并发的去发送请求,每个协程最大按照qps为10进行发送。
答: 它只是表示单个协程发送请求的最大qps数量,整个进行最大发送qps量应该等于c*q。如果有慢请求,会照成协程阻塞,这样单位时间实际的发送请求数量会小于配置的数量。可以这么理解,此时server的负载已经饱和,继续加压无济于事。在最终的report中会显示实际的qps数量。
答: 目前不支持,如果希望parameter和body不一致,那么需要对代码进行修改。比如将所有的请求放到一个文件中,发送时按照文件的顺序进行遍历,或者随机选取一个。另外hey中RequestFunc支持自定义构造请求,也需要单独开发实现。
答:直接在http client中的transport中赋值
答:会对code进行校验和分类,在report结果中展示。但不会对response中的body数据进行解析,也就是无法进行完整的正确性比对。如果要考虑正确性,需要建立requestresponse一对一的关系,不过这样也需要单独开发。