参考
开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | 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\ApacheBenchD:\Program Files\ApacheBench>ab -n1000 -c10 http://localhost:28825/HtmlPage1.html'ab' 不是内部或外部命令,也不是可运行的程序或批处理文件。D:\Program Files\ApacheBench>ApacheBench -n1000 -c10 http://localhost:28825/HtmlPage1.htmlThis is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0Copyright 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 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsFinished 1000 requestsServer 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: 0Total 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 maxConnect: 14 28 8.5 25 89Processing: 4 265 34.6 259 405Waiting: 2 147 79.9 144 404Total: 28 294 36.2 289 443Percentage 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.htmlApacheBench -n2000 -c100 http://localhost:28825/HtmlPage1.htmlApacheBench -n1000 -c200 http://localhost:28825/HtmlPage1.htmlApacheBench -n2000 -c200 http://localhost:28825/HtmlPage1.htmlApacheBench -n1000 -c300 http://localhost:28825/HtmlPage1.htmlApacheBench -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平台分布式架构实践 - 负载均衡