前言

在学习ab工具之前,我们需了解几个关于压力测试的概念 。

吞吐率(Requests per second)

概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
计算公式:总请求数 / 处理完成这些请求数所花费的时间,即

并发连接数(The number of concurrent connections)

概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

并发用户数(The number of concurrent users,Concurrency Level)

概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

用户平均请求等待时间(Time per request)

计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即

服务器平均请求等待时间(Time per request: across all concurrent requests)

计算公式:处理完成所有请求数所花费的时间 / 总请求数,即


可以看到,它是吞吐率的倒数。
同时,它也=用户平均请求等待时间/并发用户数,即

ab工具简介

ab全称为:Apache Benchmark

  • 在官网上的解释:ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。
  • 其他网站解释:ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

ab工具下载

进入apache官网:http://httpd.apache.org/ 下载apache即可。

ab工具启动

  1. 以windows环境下为例,打开Apache服务器的安装路径,在bin目录中有一个ab.exe的可执行程序,就是我们要介绍的压力测试工具。
    ab.exe
  2. 在windows系统的cmd命令行下,进入ab.exe程序所在目录,执行ab.exe程序。直接双击无法正确运行。
    run ab
  3. 执行ab命令成功后,可以看到如上图提示。该帮助很清楚详细的介绍了ab的用法以及各个参数的含义。
    ab的用法是:
    ab [options] [http/https]hostname[:port]/path
    例如:ab -n 5000 -c 200 [http/https]hostname[:port]/index.php
    上例表示总共访问index.php这个脚本5000次,200并发同时执行。
    ab常用参数的介绍:
    -n : 总共的请求执行数,缺省是1;
    -c : 并发数,缺省是1;
    -t : 测试所进行的总时间,秒为单位,缺省50000s
    -p : POST时的数据文件
    -w : 以HTML表的格式输出结果
  4. 执行测试用例:
    ab -n 1000 -c 100 -w [http/https]hostname[:port]/index.php >>d:lyafei.html

ab implementation process
上面的测试用例表示100并发的情况下,共测试访问index.php脚本1000次,并将测试结果保存到 d:lyafei.html文件中。
测试报告如下图,可知在该100并发访问的情况下,共测试访问1000次,失败了790次。可知该脚本在此环境无法满足100并发访问的要求。同时也展示压力测试的几个重要指标。
ab result

//并发请求数
Concurrency Level: 100
//整个测试持续的时间
Time taken for tests: 68.985 seconds
//完成的请求数
Complete requests: 1000
//失败的请求数
Failed requests: 790
//整个场景中的网络传输量
Total transferred: 11416206 bytes
//整个场景中的HTML内容传输量
HTML transferred: 11194788 bytes
//吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Requests per second: 14.50 [#/sec] (mean)
//用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request: 5087.180 [ms] (mean)
//服务器平均请求处理时间,大家最关心的指标之三
Time per request: 50.872 [ms] (mean, across all concurrent requests)
//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Transfer rate: 161.61 [Kbytes/sec] received

关于POST请求压测

ab -n 1000 -c 100 -p "post.txt" -T "application/x-www-form-urlencode" -w "http://api.lyafei.com/app/ >>d:lyafei.com"
//ps : post.txt 文本存放的是post请求所需参数

关于登录的问题

有时候压力测试需要客户登录,怎么办?可以参考以下步骤:

  1. 先用账号和密码登录后,用浏览器开发者工具,一般快捷键为F12,有的浏览器会叫检查,右键即可找到,打开工具后找到标识这个会话的Cookie值(Session ID)记下来
  2. 如果只用到一个Cookie,那么只需要键入命令:
    ab -n 100 -H "Cookie: key=value http://www.lyafei.com/"
    如果需要多个Cookie,就直接设置Header请求头:
    ab -n 100 -H "Cookie: key1=value1; key2=value2" http://www.lyafei.com

关于报错

apr_socket_recv: Connection reset by peer (104) : 用apache 自带的ab工具测试,当并发量比较多的时候比如超过1000并发会报上述的错误。查看应用服务器和数据库均未报错,连接被重置,Google了一下,apr_socket_recv这个是操作系统内核的一个参数,在高并发的情况下,内核会认为系统受到了SYN flood攻击,会发送cookies(possible SYN flooding on port 80. Sending cookies),这样会减慢影响请求的速度,所以在应用服务器上设置下这个参数为0禁用系统保护就可以进行大并发测试了

vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 0
sysctl -p

另附其他系统内核参数说明:

#此参数是为了防止洪水攻击的,但对于大并发系统,要禁用此设置
net.ipv4.tcp_syncookies = 0  
#参数决定了SYN_RECV状态队列的数量,一般默认值为512或者1024,即超过这个数量,系统将不再接受新的TCP连接请求,一定程度上可以防止系统资源耗尽。可根据情况增加该值以接受更多的连接请求。
net.ipv4.tcp_max_syn_backlog
#参数决定是否加速TIME_WAIT的sockets的回收,默认为0。
net.ipv4.tcp_tw_recycle
#参数决定是否可将TIME_WAIT状态的sockets用于新的TCP连接,默认为0。
net.ipv4.tcp_tw_reuse
#参数决定TIME_WAIT状态的sockets总数量,可根据连接数和系统资源需要进行设置。 
net.ipv4.tcp_max_tw_buckets

总结

总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标;可以用做临时的紧急任务和简单测试。

最后修改:2019 年 12 月 31 日 03 : 17 PM
如果觉得我的文章对你有用,请随意赞赏