Ubuntu下使用Apache Bench对网站进行压力测试
1. 什么是网站的压力测试
一般来说,衡量网站的性能指标,需要从以下几点进行考量:
- 响应时间
- 吞吐量
- 并发量
- 性能计数器
1.1 响应时间
响应时间抽象点来说可以是执行一个操作的从开始到完成的总耗时,包括:
- 客户端和服务器传输 - 几十毫秒 ~ 几秒都有可能
- 服务器处理请求查询数据库 - 几毫秒
- 机械硬盘寻址 - 几毫秒
- 机械硬盘1M数据 - 2毫秒
- SSD读取1M数据 - 0.3 毫秒
- 内存读取1M数据 - 10微秒
- 程序简单逻辑处理 - 微秒
1.2 吞吐量
吞吐量指单位时间内系统处理的请求数量,体现系统的整体处理能力。
对于网站,可用“请求数/秒”、“页面数/秒”或“访问人数/天”、“处理业务数/小时”等来衡量。
重要指标有TPS(每秒处理的事物数)、QPS(每秒查询的请求数)、HPS(每秒HTTP请求数)等。
1.3 并发量
并发量指系统能够同时处理的请求的数目,这个数字反映了系统的负载性能。对于网站而言,并发数指网站用户同时提交请求的用户数目。
1.4 性能计数器
性能计数器描述服务器或操作系统性能的一些数据KPI指标。
如System Load、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等使用情况。
通过对这些指标设置报警阈值,当监控系统发现性能计数器超过阈值时,就向开发人员和运维报警,及时发现异常并处理。
2. 安装Apache Bench对网站进行压力测试
ab是apache自带的压力测试工具。ab进行的一切测试本质上是基于HTTP的。
2.1 安装Apache Bench命令
sudo apt-get install apache2-utils
2.2 AB命令参数说明
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
##总的请求数
-n requests Number of requests to perform
##一次同时并发的请求数 总的请求数(n)=次数*一次并发数(c)
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-b windowsize Size of TCP send/receive buffer, in bytes
-p postfile File containing data to POST. Remember also to set -T
-u putfile File containing data to PUT. Remember also to set -T
-T content-type Content-type header for POSTing, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of 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. 'Apache=1234. (repeatable)
-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.
-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
-r Don't exit on socket receive errors.
-h Display usage information (this message)
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol (SSL2, SSL3, TLS1, or ALL)
一般来说简单实用,我们只用关注 -n 和 -c 参数就行了。
2.3 测试兔子先生网站
ab -n 100 -c 10 https://www.xtuz.net/
Benchmarking www.xtuz.net (be patient).....done
Server Software: nginx/1.16.1
Server Hostname: www.xtuz.net
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-CHACHA20-POLY1305,2048,256
TLS Server Name: www.xtuz.net
# 页面路径
Document Path: /
# 页面大小
Document Length: 14495 bytes
# 并发数目
Concurrency Level: 10
# 整个测试持续的时间
Time taken for tests: 8.400 seconds
# 完成请求数
Complete requests: 100
# 失败请求数
Failed requests: 98
(Connect: 0, Receive: 0, Length: 98, Exceptions: 0)
Total transferred: 1469695 bytes
HTML transferred: 1448495 bytes
# 每秒处理请求数
Requests per second: 11.90 [#/sec] (mean)
## 平均每个请求处理时间为840毫秒 注:这里将一次10个并发请求看成一个整体
Time per request: 839.989 [ms] (mean)
## 平均每个并发请求处理 时间 为84毫秒
Time per request: 83.999 [ms] (mean, across all concurrent requests)
## 传输速度
Transfer rate: 170.87 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 4 4.6 2 18
Processing: 74 740 462.6 628 2702
Waiting: 74 740 462.6 628 2702
Total: 91 744 461.5 631 2705
Percentage of the requests served within a certain time (ms)
## 在这100个请求中有50%在631毫秒内完成
50% 631
66% 755
75% 861
80% 965
90% 1368
95% 1803
98% 2355
99% 2705
100% 2705 (longest request)
发送100个请求,并发数为10
结论是 每秒可以处理11个请求
2.4 2. 测试时出现的Failed requests原因分析:
只要出现 Failed Request 就会对应有说明
Failed requests: 98
(Connect: 0, Receive: 0, Length: 98, Exceptions: 0)
分别有Connect、Receive、Length、Exceptions。
- Connect 无法送出要求、目标主机连接失败、要求的过程中被中断。
Revieve 表示接受过程中被终端,例如主机主动断开连接
Length 响应的内容长度不一致 ( 以 Content-Length 头值为判断依据 )。
- Exception 发生无法预期的错误。
兔子先生 测试失败请求都落在Length类别上,原因是动态页面,可以不用考虑
展开剩余53%