当你使用PHP(或其他编程语言)完成一个web程序的开发,并且web程序在Apache服务器上正常运行的时候,你有没有考虑过对你的Apache服务器及部署在其上的web程序进行一些压力测试呢?
毕竟,真金不怕火炼,只要配置优化合理、程序代码运行性能良好、硬件撑得住,通过压力测试我们就能看到一个喜人的成绩。
话又说回来,即使测试结果差强人意或者糟糕透了,我们也可以好好反思并找到「问题出在哪里」。
说了这么多废话,其实就是想告诉你一句:对服务器以及网站程序进行压力测试还是很有必要的。
要对Apache及其上的web程序进行压力测试其实非常简单,我们也不用再额外下载安装什么测试工具,因为Apache HTTP Server已经给我们准备了一个压力测试工具——ab。
ab,即Apache Benchmark,只要我们安装了Apache,就能够在Apache的安装目录中找到它。它的居住地址是Apache安装目录/bin/ab.exe。现在,我们就来看看如何使用ab.exe来进行压力测试。
在使用之前我们先来学习一下ab的用法。首先,我们输入cmd打开DOS窗口,然后将更改当前工作目录为:Apache安装目录/bin/。然后键入帮助命令ab -help 或者>ab,我们就可以看到如下的用法介绍界面。
ab的用法介绍:
通过上面的用法介绍可以得知,ab的使用方法就是输入如下DOS命令:
ab [可选的参数选项] 需要进行压力测试的url此外,我们再根据上面的用法介绍界面来详细了解每个参数选项的作用。
-n 即requests,用于指定压力测试总共的执行次数。 -c 即concurrency,用于指定压力测试的并发数。 -t 即timelimit,等待响应的最大时间(单位:秒)。 -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置 -T参数。 -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置 -T参数。 -T 即content-type,用于设置Content-Type请求头信息,例如: application/x-www-form-urlencoded,默认值为 text/plain。 -v 即verbosity,指定打印帮助信息的冗余级别。 -w 以HTML表格形式打印结果。 -i 使用HEAD请求代替GET请求。 -x 插入字符串作为table标签的属性。 -y 插入字符串作为tr标签的属性。 -z 插入字符串作为td标签的属性。 -C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。 -H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。 -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。 -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。 -X 指定使用的代理服务器和端口号,例如:"126.10.10.3:88"。 -V 打印版本号并退出。 -k 使用HTTP的KeepAlive特性。 -k 使用HTTP的KeepAlive特性。 -d 不显示百分比。 -S 不显示预估和警告信息。 -g 输出结果信息到gnuplot格式的文件中。 -e 输出结果信息到CSV格式的文件中。 -r 指定接收到错误信息时不退出程序。 -h 显示用法信息,其实就是 ab -help。虽然ab可以配置的参数选项比较多,但是,一般情况下我们只需要使用形如ab -n 数字 -c 数字 url路径的命令即可。譬如,我们对位于本地Apache服务器上、URL为localhost/index.php(你想测试的url)的页面进行压力测试。测试总次数为5000,并发数为200(相当于200个用户同时访问,他们总共访问5000次)。
我们输入DOS命令ab -n 5000 -c 200 localhost/index.php,打印结果如下:
Finished 5000 requests 完成了5000次请求 Server Software: Apache/2.4.23 (服务器软件名称及版本信息) Server Hostname: localhost (服务器主机名) Server Port: 80 (服务器端口) Document Path: /wslt/public/index.php(供测试的URL路径) Document Length: 55863 bytes (供测试的URL返回的文档大小) Concurrency Level: 200 (并发数) Time taken for tests: 648.119 seconds (压力测试消耗的总时间) Complete requests: 5000 (压力测试的总次数) Failed requests: 423 (失败的请求数) Write errors: 0 (网络连接写入错误数) Total transferred: 382617684 bytes (传输的总数据量) HTML transferred: 380740646 bytes (HTML文档的总数据量) Requests per second: 4048.34 [#/sec] (mean) (平均每秒的请求数) Time per request: 25924.763 [ms] (mean) (所有并发用户(这里是200)都请求一次的平均时间) Time per request: 129.624 [ms] (mean, across all concurrent requests) (单个用户请求一次的平均时间) Transfer rate: 782.78 [Kbytes/sec] received (传输速率,单位:KB/s) Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 5 Processing: 7201 25589 2752.2 25301 33440 Waiting: 7194 25580 2752.8 25293 33433 Total: 7202 25589 2752.2 25301 33440 Percentage of the requests served within a certain time (ms) 在一定时间内送达请求的百分比 50% 25301 66% 25826 75% 26399 80% 26852 90% 28435 95% 30542 98% 31489 99% 31731 100% 33440 (longest request)在上面的测试中,我们设置的压力测试总次数以及并发数并没有让服务器感觉到什么「压力」,现在我们再来看一个「压力山大」的执行命令:ab -n 100000 -c 1000 localhost/index.php,这个时候apache就直接罢工——拒绝访问了:
D:\wamp64\bin\apache\apache2.4.23\bin>ab -n 100000 -c 1000 localhost/ wslt/public/index.php This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient) Test aborted after 10 failuresapr_socket_connect(): 由于目标计算机积极拒绝,无法连接。 (730061)