通常大家使用的压测软件都是通过通过网络进行压测的,但是作为后端开放人员,在进行压测的时候网络因素要尽可能的减小。所以通常来说我们会在服务器上直接针对接口进行进行压力测试。在服务器端的压力测试软件通常为ab和http_bulid
http_bulid这款软件作为轻量级压测软件,是普通接口压测的利器,只需要准备部分url即能发起压测,但是确定也很明显,不支持post的请求方式。
ab作为一款开源软件能简单便捷的发起各种压测请求,本文的主题,使用ab进行文件上传接口的压测。但是其中上传文件接口的压力测试在网络上的资料少之又少(我翻了好多都没有找到相关说明),但是由于ab支持post的请求,我坚信他可发起文件上传请求
yum -y install httpd-tools
详细文档可见官方文档
Server Software: Apache #服务器软件
Server Hostname: www.taoquan.ink #域名
Server Port: 80 #请求端口号
Document Path: / #文件路径
Document Length: 40888 bytes #页面字节数
Concurrency Level: 10 #请求的并发数
Time taken for tests: 27.300 seconds #总访问时间
Complete requests: 1000 #请求成功数量
Failed requests: 0 #请求失败数量
Write errors: 0
Total transferred: 41054242 bytes #请求总数据大小(包括header头信息)
HTML transferred: 40888000 bytes #html页面实际总字节数
Requests per second: 36.63 [#/sec] (mean) #每秒多少请求,这个是非常重要的参数数值,服务器的吞吐量
Time per request: 272.998 [ms] (mean) #用户平均请求等待时间
Time per request: 27.300 [ms] (mean, across all concurrent requests) # 服务器平均处理时间,也就是服务器吞吐量的倒数
Transfer rate: 1468.58 [Kbytes/sec] received #每秒获取的数据长度
Connection Times (ms)
min mean[+/-sd] median max
Connect: 43 47 2.4 47 53
Processing: 189 224 40.7 215 895
Waiting: 102 128 38.6 118 794
Total: 233 270 41.3 263 945
Percentage of the requests served within a certain time (ms)
50% 263 #50%用户请求在263ms内返回
66% 271 #66%用户请求在271ms内返回
75% 279 #75%用户请求在279ms内返回
80% 285 #80%用户请求在285ms内返回
90% 303 #90%用户请求在303ms内返回
95% 320 #95%用户请求在320ms内返回
98% 341 #98%用户请求在341ms内返回
99% 373 #99%用户请求在373ms内返回
100% 945 (longest request)
准备一张想要测试的文件 例如 把这张图片上传到要压测的服务器上
使用vim打开该文件 在开头加入如下3行 注 // 为注释的意思不要在正式压测的文件中加入//后的信息
------WebKitFormBoundaryAFQSEaLDUcBnvQtT//边界值
Content-Disposition: form-data; name="name"
e9ec28e8caac000ae122951b99af9f26.png //文件的路径
------WebKitFormBoundaryAFQSEaLDUcBnvQtT
Content-Disposition: form-data; name="image";filename="e9ec28e8caac000ae122951b99af9f26.png"
Content-Type: image/png //
在结尾加入
------WebKitFormBoundaryAFQSEaLDUcBnvQtT---- 边界值结尾 可以随便取名但是要跟开头对应
具体请求如下
-T : 标识设置Content-Type请求头信息 例如multipart/form-data 使用表单进行信息传输
boundary : 标识文件边界 跟修改文件的时候的边界进行对应 http://localhost/interface/Resource/upload :上传文件接口
e9ec28e8caac000ae122951b99af9f26.txt 修改之后保存的文件
ab -n 10 -c 6 -p e9ec28e8caac000ae122951b99af9f26.txt -T "multipart/form-data; boundary=----WebKitFormBoundaryAFQSEaLDUcBnvQtT" http://localhost/interface/Resource/upload
压测返回
Server Software: nginx
Server Hostname: localhost
Server Port: 80
Document Path: /interface/Resource/upload
Document Length: 64 bytes
Concurrency Level: 6
Time taken for tests: 0.075 seconds
Complete requests: 10
Failed requests: 0
Write errors: 0
Total transferred: 2700 bytes
Total body sent: 4835660
HTML transferred: 640 bytes
Requests per second: 133.82 [#/sec] (mean)
Time per request: 44.836 [ms] (mean)
Time per request: 7.473 [ms] (mean, across all concurrent requests)
Transfer rate: 35.28 [Kbytes/sec] received
63194.35 kb/s sent
63229.64 kb/s total
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 1
Processing: 22 26 3.8 26 35
Waiting: 21 26 3.8 26 35
Total: 22 26 3.9 27 35
Percentage of the requests served within a certain time (ms)
50% 27
66% 27
75% 28
80% 28
90% 35
95% 35
98% 35
99% 35
100% 35 (longest request)
日志文件
[ 2020-04-03T04:49:27+00:00 ] /interface/Resource/upload | INFO: File = Array
(
[image] => Array
(
[name] => Octocat.png
[type] => image/pngÿٿ
[tmp_name] => /tmp/phpEffiu2
[error] => 0
[size] => 483204
)
)
由以上返回可以看出 本次压测成功了 具体可以在根据相关的参数进行调整具体测试接口的抗压能力了
由于网络上的文档较少只能靠着自己摸索,但是我想到咱们在web端的from表单上传文件大家都用过我们能不能通过浏览器的打印的接口信息发现点有用的东西呢 如下图即为web端上传文件的例子
我们注意到其中 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。
消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。
还包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。
我就尝试模拟该请求
但是后端一直在报错
我就思考是那个地方出问题了那
然后想到我的内容主题没有放进去,但是我的内容主题应该是啥呢?
我就想到传递文件都是以二进制的形式创建的 那我把二进制放进去行吗?我就把二进制文件直接放到了里面再次请求就成功了。到现在总算是完成了上传接口的调通
这次经历我也感觉到自己的基本功并不扎实,当遇到一些比较难的问题的时候往往基本原理能给你一点新的思路
最后送大家 :学无止境、永攀高峰-------你敬爱的隔壁老王