ab压测工具

1. 压力测试是什么,为什么要用?

  • 压力测试,是确立系统稳定性的一种测试方法。压力测试是针对特定系统或者组件所做的测试,目的是确认其稳定性。发现在什么条件下应用程序的性能会变得不可接受。比如说短时间内大量用户访问,可能造成服务器的压力太大导致服务崩溃。因此,对于我们的web server,我们有必要通过压力测试来评估是否能够承载预期的访问压力。
  • 压力测试可以从以下几个维度评估:
    • 响应时间
    • 并发用户数
    • 吞吐量
    • 资源利用率
  • 人工模拟压力测试显然不合适,这就需要借助工具了。最常见的web压测工具就是ab - apache benchmark

2. ab压测工具介绍

  • ab是apachebench命令的缩写,ab命令会创建多个并发访问线程,模拟多个访问者同时对某一HTTP URL地址进行访问。
  • ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。

3. 安装ab

  • Mac有自带Apache和ApacheBench,可以在终端使用ab -V查看。其它系统可以在官网下载。
    [图片]

4. 使用ab

  • ab - Apache HTTP server benchmarking tool详细说明文档
  • 使用ab的格式
    ab [ -A auth-username:password ] [ -b windowsize ] [ -B local-address ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -E client-certificate file ] [ -f protocol ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -l ] [ -m HTTP-method ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:password ] [ -q ] [ -r ] [ -s timeout ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -u PUT-file ] [ -v verbosity] [ -V ] [ -w ] [ -x -attributes ] [ -X proxy[:port] ] [ -y -attributes ] [ -z
    -attributes ] [ -Z ciphersuite ] [http[s]://]hostname[:port]/path

    ab -c 100 -n 100 http

    • 常用参数介绍
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      # 常用参数设置
      -n 测试会话中所执行的请求个数,默认仅执行一个请求,如果不指定-t参数,默认执行完所有请求后自动结束压测

      -c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个,此参数可以控制对服务器的单位时间内的并发量

      -t 测试所进行的最大秒数,默认为无时间限制....其内部隐含值是[-n 50000],它可以使对服务器的测试限制在一个固定的总时间以内,如果时间到了,请求个数还未执行完,也会被停止。

      -p 包含了需要POST的数据的文件,数据格式以接口请求参数定义的格式为准,eg. xxx.json
      #json 内容示例: {"name":"小明","sex":"男"}

      -T POST 数据所使用的Content-type头信息,指定请求参数格式,eg. application/json

      -r 在接口返回失败后,默认会终止压测,添加此参数后压测会继续进行
      - 常用命令及输出结果分析
      # 以每秒10个请求的速度对此接口进行访问,知道请求数达到1000个为止,忽略接口返回的错误信息
      ab -n 1000 -c 10 -r http://127.0.0.1:8000/data-resource/

      # 输出结果
      # 基本信息
      Server Software: WSGIServer/0.2
      Server Hostname: 127.0.0.1
      Server Port: 8000

      # HTTP响应数据的正文长度
      Document Path: /data-resource/
      Document Length: 1528 bytes

      Concurrency Level: 10 # 并发用户数,这是我们设置的参数之一(-c)
      Time taken for tests: 30.257 seconds # 所有这些请求被处理完成所花费的总时间 单位秒
      Complete requests: 1000 # 总请求数量
      Failed requests: 0 # 表示失败的请求数量
      Total transferred: 1858000 bytes # 所有请求的响应数据长度总和。包括每个HTTP响应数据的头信息和正文数据的长度
      HTML transferred: 1528000 bytes # 所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度
      Requests per second: 33.05 [#/sec] (mean) # 平均每秒的请求数
      Time per request: 302.565 [ms] (mean) # 所有并发用户(这里是10)都请求一次的平均时间
      Time per request: 30.257 [ms] (mean, across all concurrent requests) # 单个用户请求一次的平均时间
      Transfer rate: 59.97 [Kbytes/sec] received # 传输速率,单位:KB/s

      # 一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。
      Connection Times (ms)
      min mean[+/-sd] median max # [+/-sd]表示标准差(Standard Deviation)
      Connect: 0 0 0.1 0 2
      Processing: 264 299 63.0 287 1340
      Waiting: 264 297 63.1 285 1340
      Total: 264 299 63.0 287 1341

      Percentage of the requests served within a certain time (ms)
      50% 287 # 50%的请求在0.287秒内返回
      66% 295
      75% 303
      80% 308
      90% 332
      95% 353
      98% 375
      99% 396
      100% 1341 (longest request)
    • post请求命令
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      # post 命令
      ab -n 100 -c 10 -r -p data -T 'application/json' http://127.0.0.1:8000/data-resource/

      Server Software: WSGIServer/0.2
      Server Hostname: 127.0.0.1
      Server Port: 8000

      Document Path: /data-resource/
      Document Length: 323 bytes

      Concurrency Level: 10
      Time taken for tests: 3.311 seconds
      Complete requests: 100
      Failed requests: 14 # 因网络原因或服务器性能原因,发起的请求并不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考。
      (Connect: 0, Receive: 0, Length: 14, Exceptions: 0)
      Total transferred: 65714 bytes
      Total body sent: 43200
      HTML transferred: 32314 bytes
      Requests per second: 30.20 [#/sec] (mean)
      Time per request: 331.081 [ms] (mean)
      Time per request: 33.108 [ms] (mean, across all concurrent requests)
      Transfer rate: 19.38 [Kbytes/sec] received
      12.74 kb/s sent
      32.13 kb/s total

      Connection Times (ms)
      min mean[+/-sd] median max
      Connect: 0 0 0.1 0 1
      Processing: 272 300 18.8 299 342
      Waiting: 270 296 17.5 296 339
      Total: 272 300 18.8 299 342

      Percentage of the requests served within a certain time (ms)
      50% 299
      66% 308
      75% 316
      80% 320
      90% 326
      95% 334
      98% 339
      99% 342
      100% 342 (longest request)

    ab压测工具
    http://example.com/2023/04/01/ab压测工具/
    作者
    gsYang's blog
    发布于
    2023年4月1日
    许可协议