WEB性能测试--服务器
目录
WEB 服务中,对于不同的请求,响应速度(性能)是不一样的。对于静态文件的响应一般会很快,尤其是使用了前端缓存技术的(例如 nginx 缓存、varnish缓存、CDN 缓存等)。
下面将以静态页面的测试为例,详细讲解 WEB 服务性能测试方案。
在只有一台裸机的情况下,响应速度会受限于服务器的 CPU、内存、磁盘IO、数据库QPS、文件系统 等,所以需要在测试的时候,实时监控系统的情况。
参考的测试方式:http://hi.baidu.com/higkoo/item/f3258f02a5afa925a1312d26?qq-pf-to=pcqq.c2c
一、准备测试环境
请根据实际情况组建测试环境,如果要测试线上 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
详细中文使用方法参考:http://linux.cn/article-3215-1.html
4、测试命令以及参数
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 次的平均值作为测试结果。
5、系统性能分析命令
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 命令,查看测试前机器的状态;等到测试的时候,再对比一下测试前后系统的状态。
6、测试例子结果分析
这里想要测试 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 |
|
|