Web 性能压测工具 ApacheBench(ab)使用总结

导语

对于 web 服务,不管是上新,还是平时产品运营,节假日活动等,在这之前都需要评估现网压力承受能力,提前进行扩容,并做到防患于未然。所以对网站性能压力测试是必不可少的,这样才能充分了解自己部署的 web 服务 QPS。只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题。Apache 中有个自带的,名为 ab 的程序,可以对 Apache 或其它类型的服务器进行网站访问压力测试。

1. ApacheBench 命令原理

ab 命令会创建很多的并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,既可以用来测试 Apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。

ab 命令对发出负载的计算机要求很低,既不会占用很高 CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似 CC 攻击。自己测试使用也须注意,否则一次上太多的负载,可能造成目标服务器因资源耗完,严重时甚至导致死机。

2. ApacheBench 参数说明

1) Synopsis

ab [ -A auth-username:password ] [ -b windowsize ] [ -B local-address ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-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

2) Options

-n requests Number of requests to perform

//在测试会话中所执行的请求个数(本次测试总共要访问页面的次数)。默认时,仅执行一个请求。

-c concurrency Number of multiple requests to make

//一次产生的请求个数(并发数)。默认是一次一个。

-t timelimit Seconds to max. wait for responses

//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

-p postfile File containing data to POST

//包含了需要 POST 的数据的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt 。 (配合-T)

-T content-type Content-type header for POSTing

//POST 数据所使用的 Content-type 头信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)

-v verbosity How much troubleshooting info to print

//设置显示信息的详细程度 – 4 或更大值会显示头信息, 3 或更大值可以显示响应代码(404, 200 等), 2 或更大值可以显示警告和其他信息。 -V 显示版本号并退出。

-w Print out results in HTML tables

//以 HTML 表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。

-i Use HEAD instead of GET

// 执行 HEAD 请求,而不是 GET。

-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable)

//-C cookie-name=value 对请求附加一个 Cookie:行。 其典型形式是 name=value 的一个参数对。此参数可以重复,用逗号分割。

提示:可以借助 session 实现原理传递 JSESSIONID 参数, 实现保持会话的功能,如

-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.

//-P proxy-auth-username:password 对一个中转代理提供 BASIC 认证信任。用户名和密码由一个:隔开,并以 base64 编码形式发送。无论服务器是否需要(即, 是否发送了 401 认证需求代码),此字符串都会被发送。

-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)

//-attributes 设置属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现 HTTP/1.x; 仅接受某些’预想’的响应格式。 strstr(3) 的频繁使用可能会带来性能问题,即你可能是在测试 ab 而不是服务器的性能。

参数很多,常用的就两个,例如:

# ab -c 1000 -n 100 http://10.50.120.121/test/blank

3. ApacheBench 用法详解

在 Linux 系统,一般安装好 Apache 后可以直接执行;

#ab -k -n 100000 -c 500 -H "Accept-Encoding: gzip, deflate, sdch" -H "User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 QQ/7.0.0.3002_GrayThree_309592_04-27_23:04 V1_IPH_SQ_7.0.0_5_HDBM_T Pixel/750 Core/UIWebView NetType/WIFI QBWebViewType/1" -C "uin=o0369491785;skey=@MC7dyF5lu;" http://10.51.170.39/sport/home?_wv=2163715

如果是 win 系统下,打开 cmd 命令行窗口,cd 到 apache 安装目录的 bin 目录下

上述命令的含义是:

在长连接状态下,模拟移动端,请求头带 gzip 压缩,并且带登录态,一次 500 个并发,总请求量为 100000,向指定机器 IP 和页面的 URL 发送请求 URL 也可以是域名,本地配置 HOST 指向要压测的机器 IP 也可以~

稍等片刻,执行结果及分析如下:

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

Benchmarking 10.51.170.39 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests

Server Software:                         //测试服务端类型
Server Hostname:        10.51.170.39     //测试服务器 HOST
Server Port:            80               //测试服务端端口号

Document Path:          /sport/home?_wv=2163715   //The request URI parsed from the command line string.
Document Length:        62346 bytes               //This is the size in bytes of the first successfully returned document. If the document length changes during testing, the response is considered an error.

Concurrency Level:      500                       //The number of concurrent clients used during the test
Time taken for tests:   158.969 seconds           //This is the time taken from the moment the first socket connection is created to the moment the last response is received
Complete requests:      100000                    //The number of successful responses received
Failed requests:        0                         //The number of requests that were considered a failure. 
Write errors:           0                         //he number of errors that failed during write (broken pipe).
Keep-Alive requests:    100000                    //The number of connections that resulted in Keep-Alive requests
Total transferred:      6266233588 bytes          //The total number of bytes received from the server. This number is essentially the number of bytes sent over the wire.
HTML transferred:       6236217388 bytes          //The total number of document bytes received from the server. This number excludes bytes received in HTTP headers
Requests per second:    629.05 [#/sec] (mean)     //This is the number of requests per second. This value is the result of dividing the number of requests by the total time taken
Time per request:       794.847 [ms] (mean)       //The average time spent per request. The first value is calculated with the formula concurrency * timetaken * 1000 / done while the second value is calculated with the formula timetaken * 1000 / done
Time per request:       1.590 [ms] (mean, across all concurrent requests)
Transfer rate:          38494.01 [Kbytes/sec] received            //The rate of transfer as calculated by the formula totalread / 1024 / timetaken

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.1      0      34
Processing:   296  793 151.5    809    2962
Waiting:      232  690 153.2    713    2724
Total:        296  793 152.1    809    2992

//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中 50%的用户响应时间小于 809 毫秒,66%的用户响应时间小于 854 毫秒,最大的响应时间小于 2992 毫秒。对于并发请求,cpu 实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个 Time per request 时间约等于第二个 Time per request 时间乘以并发请求数。
Percentage of the requests served within a certain time (ms)
  50%    809
  66%    854
  75%    881
  80%    899
  90%    947
  95%    998
  98%   1075
  99%   1146
 100%   2992 (longest request)

4. 总结

一般我们在对 web 服务器进行压力测试时,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。如果只有单独的一台服务器,可以直接本地测试,比远程测试效果要准确。

参考文档:

https://httpd.apache.org/docs/2.4/programs/ab.html

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

唐维黎的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猛牛哥的博客

快手(AAU)更新记录v2.9.2.01

1354
来自专栏信安之路

从面试题中学安全

根据 Github 上的面经总结的一些安全岗面试的基础知识,这些基础知识不仅要牢记,而且要熟练操作,分享给大家,共勉。

730
来自专栏安富莱嵌入式技术分享

【分享】【原创开源应用第4期】给ili9488,RA8875类显示屏的emWin底层增加DMA加速方案

说明: 1、emWin底层中最重要的一个优化就是16bpp绘制,特此为其增加DMA加速,已经支持RA8875和ili9488。 2、使用中务必将emWin任务设...

502
来自专栏Hadoop实操

如何在CDSW中使用R绘制直方图

Cloudera的新产品CDSW(Cloudera Data Science Workbench)集成了R、Scala、Python2、Python3等语言进行...

57210
来自专栏奇点大数据

RHadoop 应用(2) : rmr2

上篇中我们介绍了rhdfs插件,R语言通过它可以加载和操作hdfs,这里为大家继续介绍Rhadoop的另一个插件rmr2,它能够在计算过程调用MapReduce...

26810
来自专栏腾讯Bugly的专栏

萝莉有话说:你的App真正适配了iOS 9吗?

时隔三月,如隔三秋。越过层层文档,穿过条条代码,小萝莉终于又和大家见面了!用户朋友们,我想死你们了!当然萝莉来此,并不是来和大家聊春晚的,我们的主题依旧是iOS...

3095
来自专栏沃趣科技

Oracle 12c R2版本 Application Containers 特性(一)

在Oracle Database 12c R2版本中,Oracle带来新的Application Containers特性,该特性对原有的多租户功能进行了增强,...

3506
来自专栏从零开始学自动化测试

jenkins构建触发器定时任务Build periodically和Poll SCM

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * ...

3685
来自专栏企鹅号快讯

那些实用的Nginx规则

1. 概述 大家都知道Nginx有很多功能模块,比如反向代理、缓存等,这篇文章总结下我们这些年实际环境中那些有用的Nginx规则和模块,大部分是用法的概括及介绍...

2025
来自专栏蓝天

三种web性能压力测试工具http_load webbench ab小结

题记:压力和性能测试工具很多,下文讨论的是我觉得比较容易上手,用的比较多的三种 http_load 下载地址:http://www.acme.com/sof...

601

扫码关注云+社区