参考
开发环境
名称 | 版本 |
---|---|
操作系统 | Windows 10 X64 |
IIS | IIS 8.0 |
Visual Studio | 2013 |
ApacheBench | . |
压力测试基本概念
以下概念来自 压力测试的轻量级具体做法
吞吐率(每秒处理请求数)
Requests per second
服务器并发处理能力的量化描述,单位是 reqs/s
,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
记住:吞吐率是基于并发用户数的。这句话代表了两个含义,
1:吞吐率和并发用户数相关;
2:不同的并发用户数下,吞吐率一般是不同的。
计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
Request per second = Complete requests / Time taken for tests
并发连接数
The number of concurrent connections
并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
并发用户数
The number of concurrent users,Concurrency Level
要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。在HTTP/1.1下,IE7支持两个并发连接,IE8支持6个并发连接,FireFox3支持4个并发连接,所以相应的,我们的并发用户数就得除以这个基数。
用户平均请求等待时间
Time per request
计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)
服务器平均请求等待时间(每请求处理时间 ms)
Time per request: across all concurrent requests
计算公式:处理完成所有请求数所花费的时间 / 总请求数,即
Time taken for / testsComplete requests
可以看到,它是吞吐率的倒数。
同时,它也=用户平均请求等待时间/并发用户数,即
Time per request / Concurrency Level
测试网站
使用 Visual Studio 2013
创建一个 Web 项目 WebApplication1
,新建一个 HTML 页面 HtmlPage1.html
内容如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>压力测试</title>
</head>
<body>
<h1>压力测试</h1>
</body>
</html>
右键,在浏览器中查看
得到测试网址 http://localhost:28825/HtmlPage1.html
ApacheBench 安装
附件中可以下载
下载好之后,拷贝 ab.exe
到 D:\Program Files\ApacheBench
,并修改名称为(也可以保留原有名称 ab.exe
)ApacheBench.exe
ApacheBench 使用
使用命令提示符
进入 D:\Program Files\ApacheBench
目录
输入 ApacheBench -n1000 -c10 http://localhost:28825/HtmlPage1.html
C:\WINDOWS\system32>D:
D:\>cd D:\Program Files\ApacheBench
D:\Program Files\ApacheBench>ab -n1000 -c10 http://localhost:28825/HtmlPage1.html
'ab' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
D:\Program Files\ApacheBench>ApacheBench -n1000 -c10 http://localhost:28825/HtmlPage1.html
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 1997-2005 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: Microsoft-IIS/8.0 #服务器软件
Server Hostname: localhost #域名
Server Port: 28825 #请求端口号
Document Path: /HtmlPage1.html #文件路径
Document Length: 238 bytes #HTTP响应数据的正文长度
Concurrency Level: 10 #并发用户数,就是命名中设置的参数
Time taken for tests: 29.664093 seconds #处理请求说花费的总时间
Complete requests: 1000 #命令中设置
Failed requests: 0 #请求失败数量
Write errors: 0
Total transferred: 617000 bytes #请求总数据大小(包括header头信息)
HTML transferred: 238000 bytes #Html 页面实际总字节数
Requests per second: 33.71 [#/sec] (mean) #每秒多少请求,这个是非常重要的参数数值,服务器的吞吐量
Time per request: 296.641 [ms] (mean) #用户平均请求等待时间
Time per request: 29.664 [ms] (mean, across all concurrent requests) #服务器平均处理时间,也就是服务器吞吐量的倒数
Transfer rate: 20.29 [Kbytes/sec] received #每秒获取的数据长度
Connection Times (ms)
min mean[+/-sd] median max
Connect: 14 28 8.5 25 89
Processing: 4 265 34.6 259 405
Waiting: 2 147 79.9 144 404
Total: 28 294 36.2 289 443
Percentage of the requests served within a certain time (ms)
50% 289 #50%用户请求在 289ms 内返回
66% 298 #66%用户请求在 298ms 内返回
75% 305 #75%用户请求在 305ms 内返回
80% 311 #80%用户请求在 311ms 内返回
90% 328 #90%用户请求在 328ms 内返回
95% 367 #95%用户请求在 367ms 内返回
98% 407 #98%用户请求在 407ms 内返回
99% 425 #99%用户请求在 425ms 内返回
100% 443 (longest request)
测试结果
可以看到,我这个测试网站并发测试的结果为
总请求数 | 并发用户数 | 吞吐率(每秒处理请求数) | 每请求处理时间(ms) |
---|---|---|---|
1000 | 10 | 33.71 | 29.664 |
加大请求数量测试网站瓶颈
分别输入下面代码并统计结果
ApacheBench -n1000 -c100 http://localhost:28825/HtmlPage1.html
ApacheBench -n2000 -c100 http://localhost:28825/HtmlPage1.html
ApacheBench -n1000 -c200 http://localhost:28825/HtmlPage1.html
ApacheBench -n2000 -c200 http://localhost:28825/HtmlPage1.html
ApacheBench -n1000 -c300 http://localhost:28825/HtmlPage1.html
ApacheBench -n1000 -c400 http://localhost:28825/HtmlPage1.html
统计结果
总请求数 | 并发用户数 | 吞吐率(每秒处理请求数) | 每请求处理时间(ms) |
---|---|---|---|
1000 | 10 | 33.71 | 29.664 |
1000 | 100 | 1211.01 | 0.826 |
2000 | 100 | 1106.81 | 0.903 |
1000 | 200 | 1079.96 | 0.926 |
2000 | 200 | 1036.87 | 0.964 |
1000 | 300 | 944.31 | 1.059 |
1000 | 400 | 986.25 | 1.014 |
这里我其实是想测试 每请求处理时间(ms)
超过 1500 的情况,这种情况每个用户打开页面都超过了 1.5 秒,就需要进行优化了。
例如下面的数据(数据来源:Windows平台分布式架构实践 - 负载均衡):
总请求数 | 并发用户数 | 吞吐率(每秒处理请求数) | 每请求处理时间(ms) |
---|---|---|---|
1000 | 10 | 113.98 | 87.732 |
1000 | 100 | 115.71 | 864.216 |
2000 | 100 | 119.90 | 833.96 |
1000 | 200 | 122.96 | 1583.53 |
2000 | 200 | 118.38 | 1576.53 |
1000 | 300 | 128.91 | 2327.259 |
1000 | 400 | 127.53 | 3136.637 |
通过测试发现,我们这单个服务器的吞吐率接近在110~130之间,而一旦并发数达到200以后,每个请求的处理时间就达到1.5s多了,400个并发用户的时候每个请求要花上3s多的时间。如果在真实的网络环境中可能会更差。由此我们可以得出我们这个服务器可能最大支持120人左右同时访问。
来源:Windows平台分布式架构实践 - 负载均衡