当前位置:嗨网首页>书籍在线阅读

10-使用Apache Bench进行基准测试和负载测试

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.4 使用Apache Bench进行基准测试和负载测试

**Loadtest应用** 你还可以使用Loadtest应用来进行负载测试: 它相对于ApacheBench的优势在于,你不但可以设置并发用户,还可以设置并发请求:

一个App再怎么稳定,哪怕是满足了用户的所有需求,如果在性能上很差劲,那么它也注定是短命的。我们需要对程序进行性能测试(performance test),特别是当我们为了提升性能而对代码进行修改的时候。总不能随便改改,就放在产品环境中让用户使用,然后让用户来告诉我们程序中的性能问题吧。

性能测试包含基准测试和负载测试。基准测试(benchmark testing),或称为对比测试(comparison test),指的是运行同一个应用的不同版本,然后看哪个性能更好。当你进行性能调优时,性能测试可以有效地帮你提升程序的效率和可扩展性。测试过程就是,先创建一个标准化的测试,让这个测试在不同版本的程序上运行,然后分析结果。

而负载测试(lood testing),其实就是针对程序进行的压力测试。当对资源的需求过高,或者有太多的并发用户时,你就需要观察程序在什么样的情况下开始崩溃。一般我们都会给程序加压,直到它崩溃。崩溃是负载测试成功的标志。

npm install -g loadtest

有很多工具同时支持这两种测试,其中比较流行的是ApacheBench。它流行的原因是:在任何安装了Apache的机器上,都自带ApacheBench——而没有安装Apache的机器少之又少。这个工具又小巧,又好用,而且功能强大。当我不知道应该创建一个可复用的静态数据库连接,还是应该每次用的时候创建一个连接且用完就删掉的时候,我就会使用ApacheBench来运行测试。

ApacheBench通常被称为ab,从现在开始我也使用这个缩写。ab是一个命令行工具,它可以让我们指定一个程序被运行多少次,以及有多少并发用户。如果我们想要模拟20个并发用户同时访问一个Web应用100次,可以使用下面的命令:

loadtest [-n requests] [-c concurrency] [-k] URL
ab -n 100 -c 20 http://burningbird.net/

命令末尾的斜线是必需的,因为ab只认完整的、包含路径的URL。

ab提供了相当丰富的输出信息。下面的例子就是某次测试(隐藏了工具信息)的输出信息:

Benchmarking burningbird.net (be patient).....done
Server Software:        Apache/2.4.7
Server Hostname:        burningbird.net
Server Port:            80
Document Path:          /
Document Length:        36683 bytes
Concurrency Level:      20
Time taken for tests:   5.489 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      3695600 bytes
HTML transferred:       3668300 bytes
Requests per second:    18.22 [#/sec] (mean)
Time per request: 1097.787 [ms] (mean)
Time per request: 54.889 [ms] (mean, across all concurrent requests)
Transfer rate:          657.50 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median max
Connect:        0    1   2.3      0     7
Processing:   555 1049 196.9   1078  1455
Waiting:       53  421 170.8    404   870
Total:        559 1050 197.0   1080  1462
Percentage of the requests served within a certain time (ms)
  50% 1080
  66% 1142
  75% 1198
  80% 1214
  90% 1341
  95% 1392
  98% 1415
  99% 1462
 100% 1462 (longest request)

我们最感兴趣的就是每个测试所用时间的信息,以及最后的(基于百分比的)累积分布。根据这些输出信息,每个请求的平均时间(也就是average time per request这个标签第一次出现的地方)是1 097.787ms。这就是一个用户需要等待响应的平均时间。第二行的信息表示的是吞吐量,可能不如第一行那么有用。

累积分布则提供了另外一个视角,让我们可以很好地观察在某一时间区间内的请求所占的百分比。这些数据同样反映出用户的平均数据,从数据中我们看到的是用户获得响应的平均时间:响应时间从1 080ms到1 462ms不等,其中绝大部分对响应的处理时间为1 392ms及以下。

以上数据中最后一个值得关心的数据是每秒请求数——在本例中这个数字是18.22。这个数据在一定程度上帮助我们预测应用的可扩展性,因为它告诉我们这个应用每秒能处理多少请求——也就是,该程序处理能力的上限。但是,一定要在不同时间和不同负载之下运行这个测试,特别是如果你的系统还提供别的服务。

[1] JavaScript中的相等有3种级别,第一种是普通相等(\==),可以通过转化为bool类型进行比较是否相等;第二种是reference equal(\===),即引用一致,两个对象指向同一块内存区域,即相等;另一种是deep equal,即内容一致,两个对象指向不同的内存区域,但是它们各自包含的属性和属性值完全一致,也算是相等。——译者注