常用基础 - ab性能测试

  • 作者:KK

  • 发表日期:2017.10.22

  • 更新记录:

    • 2019.1.10 增加测试失败的分析指引

    • 2022.02.09 增加附带 header 的示例以及官方文档链接


介绍

无论是哪个平台,bin目录下都有一个ab命令程序,你可以在此执行测试ab -n 10 -c 10 http://127.0.0.1/,这个命令的意思是发送10个请求,这些请求通过模拟10个用户来发送(就是10个并发),运行后会输出一些测试报告信息(下面进行解读),而且你也会在服务器日志上看到10条请求记录。顺带提一下其实它还能对其它任何网络地址的服务器发起测试,比如nginx服务器

好了你也清楚了,其实它就是用来向指定的目标产生请求的,这样的意图主要是用来进行性能压力测试,看看目标服务器是否有顶住


主要参数说明

  • 测试地址:被发起请求的测试地址参数是放在所有参数的最后的,其中如果这个地址就是host的话那要带上/号结尾,除非是/path或/path/file.html这样就不用/号结尾

  • -n:一共发起多少次请求

  • -c:每次请求的并发量是多少,如-n 30 -c 10的话,就是将30个请求以每次10并发的方式发送,就会一共发送3波请求过去

  • -t:最大执行时长(秒),比如-n 10000000 -c 1000 -t 10就是100万个请求每次1000并发的量发出去,要求最多10秒。如果服务器在10秒内都收到了100万条请求并产生了日志,说明服务器在10秒内能承受100万;如果10秒内只产生了50万条日志,说明还有50秒条请求未收到(ab根据参数最多请求10秒,不管剩下多少次未发送,而且ab发起下一波请求的条件是上一波请求被响应回来了才行


输出报告解读

报告样本:

This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        Apache/2.4.23
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      10
Time taken for tests:   1.042 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      2140 bytes
HTML transferred:       110 bytes
Requests per second:    9.60 [#/sec] (mean)
Time per request:       1041.822 [ms] (mean)
Time per request:       104.182 [ms] (mean, across all concurrent requests)
Transfer rate:          2.01 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   2.1      1       7
Processing:   176  441 399.5    201    1031
Waiting:      176  441 399.4    201    1031
Total:        176  442 399.3    208    1032

Percentage of the requests served within a certain time (ms)
  50%    208
  66%    238
  75%   1012
  80%   1016
  90%   1032
  95%   1032
  98%   1032
  99%   1032
 100%   1032 (longest request)

图解:

而最下面那些百分比的意思是这样的:

-c不是指定了模拟的并发用户量嘛,那这些用户的情况就是50%的用户响应时间小于208毫秒,60%的用户响应时间小于238毫秒……%99的用户响应时间小于1032毫秒


分析测试失败的原因

有时候有许多测试失败的数量,如下图这样:

如果你不方便查看日志分析的话(一般是对非本机测试,比如测试环境或准线上环境),可以打开 Fiddler,设置只抓取指定host的数据包 后,在ab测试器的命令里加入-X 127.0.0.1:8888会在测试时使用代理(比如ab -n 10 -c 10 -X 127.0.0.1:8888 http://www-test.shop.com),这样就可以用 Fiddler 记下所有请求了,并看到失败状态码的请求返回了什么内容,就能进一步准确地分析测试失败的原因了。


再来一个附加 header 请求的例子

ab -c 1000 -n 10000 -q -H "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9uOG44LmNuIiwiYXVkIjoiaHR0cDpcL1wvbjhuOC5jbiIsImp0aSI6ImVkNWQ2OWE1MDNmOGQxOGUyMDQyNGNlZWM4ZDliYzU1IiwiaWF0IjoxNjQ0MjEabcdefgHAiOjE2NDQyMTM1OTAsIm5iZiI6MTY0NDIxMjE1MCwidWlkIjoiMzgwOTMxMiJ9._UhgVeDCM42LVP88KkCr-JcUQ2tVWmT6Wj52aGeVRXs" http://gw-dev.n8n8.cn/oabase/api/softuser/v1/app-index/recommend?app_session=d96376e29b9046e99667708f79d08563

官方文档

更多参数的学习使用参见 官方文档