作者/来源:新睿云小编 发布时间:2020-01-07
WEB 服务中,对于不同的请求,响应速度(性能)是不一样的。对于静态文件的响应一般会很快,尤其是使用了前端缓存技术的(例如 nginx 缓存、varnish缓存、CDN 缓存等)。
下面将以静态页面的测试为例,详细讲解 WEB 服务性能测试方案。
在只有一台裸机的情况下,响应速度会受限于服务器的 CPU、内存、磁盘IO、数据库QPS、文件系统 等,所以需要在测试的时候,实时监控系统的情况。
请根据实际情况组建测试环境,如果要测试线上 WEB 服务,不怕影响服务质量的话,也可直接使用线上环境。
下表是我使用过的一个测试环境。
网络 | 公司内网 VLAN |
WEB Client 机器配置 | CPU:Intel(R) Xeon(R) X3430 2.40GHz 4核 |
WEB Server 机器配置 | CPU:Intel(R) Xeon(R) X5650 2.67GHz 24核 |
WEB Server | Nginx 1.4.7 |
测试工具 | Apache Bentch 2.3,简称 ab |
测试静态页面(大小4K) | |
请求总数 | 根据需要自定义,请求太少测试没意义,太多很耗时间。 一般在监控性能的时候,请求多一点,例如 1M,延长测试过程,方便查看; 在测试并发数的时候,请求少一点,例如 10W,可以快速得出并发响应数。 |
测并发数 | 1, 50,100,150,200,300,500,1000 ... ,根据需要自定义 |
性能记录工具 | dstat |
服务器性能参数 | CPU负载、磁盘读写速度、网络流量、内存读写速度、系统负载 |
1、搭建 WEB Server过程略过
2、安装模拟访问工具 ab
如果机器已经安装了 Apache httpd ,则一般都自带 ab 工具,使用命令 which ab 可以找到 ab 的安装路径。如果找不到 ab 命令,请安装 httpd 即可(Redhat):yum install httpd。
3、安装性能查看工具
Redhat:yum install -y dstat
4.1、ab 命令参数
直接运行 ab 可以得到使用帮助,这里说一下 ab 命令的常用参数:
-n | 客户端发起的总请求数 |
-c | 客户端并发请求数,即有多少个用户同时发起请求 |
-k | HTTP 长连接,默认没有 -k 参数,使用的是短连接 |
url | [http[s]://]hostname[:port]/path |
例子:ab -n100000 -c 200 http://nginx.test.com/
NOTE:一些低配置的机器,在运行 ab 命令的时候可能会出现问题,主要是打开文件数太小导致的。并发数越高,越容易出现这样的问题。
4.2、测试结果解说
测试进度
测试结果
注: 1、mean是平均数的意思
2、第一个Time per request代表每个链接上单个请求的平均响应时间
第二个Time per request所有链接合计后单个请求的平均响应时间
它们之间的关系是:Tpr1=Tpr2*n,这里的Tpr1=23.054,Tpr2=0.115,n=200。
3、下面将 Requests per second 简称为 RPS,第一个 Time per request 简称为 TPR
相应时间统计
从 ConnectionTimes 可以看出,请求在建立到响应的过程中,哪个环节下消耗的时间比较多。
测试 WEBServerd的最大(佳)并发数
打开网页的速度(取决于请求响应时间)是一个很重要的用户体验。
然而请求响应时间存在小部分的极大值和极小值,那么平均响应时间不能真实反映请求响应速度,所以取95% 在某时间阀值内(例如25ms)完成比较合理。
所以假设业务的需求是:95% 请求的响应时间 < 25ms 。
假定请求总数不变,每次测试时改变并发数连接数,倘若测试结果中,有95%的请求能在25ms内处理完成,则认为当前的并发响应数是最大(佳)并发数。
同时记录服务器 CPU、内存、系统、IO、网络流量 的情况。
对于ab -n 100000 -c 200 http://nginx.test.com/,取 3 次的平均值作为测试结果。
dstat -h可以获取帮助信息
命令解释:dstat -t -c -dD sda1 -nN eth0-gyl
-t | 显示时间戳 |
-c | 统计所有CPU 状态 |
-dD sda1 | 统计磁盘分区 /dev/sda1 的读写速度,请根据实际情况指定分区,这里为 /usr/local/nginx/html/index.html 这个文件所在的分区 |
-nN eth0 | 统计网卡 eth0 的流量,请根据实际情况指定网卡 |
-g | 统计内存页换入换出速度,一般希望的值是 0 0 |
-y | 统计 CPU 中断 int 和 上下文切换 csw 信息 |
--tcp | tcp 连接状态 |
-l | 统计系统负载信息 |
系统性能分析命令
在客户端运行 ab 测试命令之前,预先运行 dsetat 命令,查看测试前机器的状态;等到测试的时候,再对比一下测试前后系统的状态。
这里想要测试 WEB Server 的大体性能,只需要测试 Requests per second 的值即可。
6.1、短链接并发测试
每个命令运行 3 次,然后取平均值
ab -n 100000 -c 1 http://nginx.test.com/
ab -n 100000 -c 50 http://nginx.test.com/
ab -n 100000 -c 100 http://nginx.test.com/
……
6.2、长链接并发测试
ab -n 100000 -c 1 -k http://nginx.test.com/
ab -n 100000 -c 50 -k http://nginx.test.com/
ab -n 100000 -c 100 -k http://nginx.test.com/
……
6.3、测试结果
Complete requests | Concurrency Level | 短链接 | 长链接 | ||
Time taken for tests | Requests per second | Time taken for tests | Requests per second | ||
100000 | 1 | 85 | 1183 | 54 | 1839 |
100000 | 50 | 9.8 | 9756 | 7.7 | 12041 |
100000 | 100 | 6249 | |||
100000 | 150 | 7432 | |||
100000 | 200 | 7996 | |||
100000 | 250 | 8584 | |||
100000 | 300 | 7313 | |||
100000 | 350 | 7189 | |||
100000 | 400 | 8335 | |||
100000 | 450 | 9545 | |||
100000 | 500 | 9866 | |||
100000 | 550 | 9965 | |||
100000 | 600 | 9685 | |||
100000 | 650 | 10124 | |||
100000 | 700 | 10053 | 55 | 12297 | |
100000 | 750 | 10204 | |||
100000 | 800 | 9731 | |||
100000 | 850 | 9921 | |||
100000 | 900 | 9909 | |||
100000 | 950 | 9908 | |||
100000 | 1000 | 9067 | |||
100000 | 1050 | 9871 | |||
100000 | 1100 | 7669 | |||
100000 | 1150 | 8849 |
使用excle做成表格,使测试结果更加形象
并发数
从图中可知:WEBServer 对于请求 http://nginx.test.com/每秒的最大响应数为 1W 左右。
Nginx 官网说能达到 5W RPS,可见当前的 WEB Server 离那个目标还差很远。
下图是测试过程中,WEBServer 的性能监控记录:dstat -t -c -dD sda1 -nN eth0 -gyl
测试前
测试前
短链接测试时(并发 700 )
短链接测试
长连接测试时(并发 700 )
长链接测试
测试前后,变化较大的有:
l 网卡流量
l CPU 中断数量以及上下文切换数
l 1分钟之内的系统负载
从性能监控记录看,进行测试时,系统性能还处于一个比较空闲的状态,负载较低。
结合测试的 RPS 和 系统性能,发现 WEB Server 还有很大的进步空间,需要进行更加深入的专业优化。
当然,这是一个很简单的测试,如果涉及到比较负载的业务等,系统各方面的负载也会相应的增加的。
测试结果详细记录表
Document Path | / | |||||||||||||||
Document Length | 555 bytes | |||||||||||||||
Concurrency Level | 1 | 50 | ||||||||||||||
Time taken for tests | 84.498 seconds | |||||||||||||||
Complete requests | 100000 | 100000 | ||||||||||||||
Failed requests | 0 | |||||||||||||||
Write errors | 0 | |||||||||||||||
Keep-Alive requests | - | |||||||||||||||
Total transferred | 75.3MB | |||||||||||||||
HTML transferred | 52.9MB | |||||||||||||||
Requests per second | 1183.47 | |||||||||||||||
Time per request 1 | 0.845 [ms] | |||||||||||||||
Time per request 2 | 0.845 [ms] | |||||||||||||||
Transfer rate(received) | 911.87 KBps | |||||||||||||||
Connection Times (ms) | Connect | 0+/-0.4 | ||||||||||||||
Processing | 0 | |||||||||||||||
Waiting | 0 | |||||||||||||||
Total | 1 | |||||||||||||||
Percentage of the requests served within a certain time (ms) | 50% | 1 | ||||||||||||||
66% | 1 | |||||||||||||||
75% | 1 | |||||||||||||||
80% | 1 | |||||||||||||||
90% | 1 | |||||||||||||||
95% | 1 | |||||||||||||||
98% | 1 | |||||||||||||||
99% | 2 | |||||||||||||||
100% | 205 |