网站性能测试指标及网站压力测试
1. 一般衡量网站性能有哪些指标?
性能指标主要有响应时间,吞吐量,并发量,性能计数器。
1)响应时间
指应用执行一个操作需要的时间,即从发出请求到最后收到响应数据所需要的时间。
系统常用操作响应时间表
操作
|
响应时间
|
打开一个网站
|
几秒
|
数据库查询一条记录(有索引)
|
十几毫秒
|
机械磁盘一次寻址定位
|
4毫秒
|
从机械磁盘顺序读取1M数据
|
2毫秒
|
从SSD磁盘顺序读取1M数据
|
0.3毫秒
|
从远程分布式换成Redis读取一个数据
|
0.5毫秒
|
从内存读取1M数据
|
十几微秒
|
Java程序本地方法调用
|
几微秒
|
网络传输2Kb数据
|
1微秒
|
实践中通常采用的办法是重复请求,比如一个请求操作重复执行1万次,测试一万次执行的总响应时间之和,然后除以1万,就得到单次请求的响应时间。
2)吞吐量
指单位时间内系统处理的请求数量,体现系统的整体处理能力。对于网站,可用“请求数/秒”、“页面数/秒”或“访问人数/天”、“处理业务数/小时”等来衡量。重要指标有TPS(每秒处理的事物数)、QPS(每秒查询的请求数)、HPS(每秒HTTP请求数)等。
3)并发量
指系统能够同时处理的请求的数目,这个数字反映了系统的负载性能。对于网站而言,并发数指网站用户同时提交请求的用户数目。
4)性能计数器
描述服务器或操作系统性能的一些数据指标。如System Load、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等使用情况。通过对这些指标设置报警阈值,当监控系统发现性能计数器超过阈值时,就向开发人员和运维报警,及时发现异常并处理。
2. 怎么测试网站性能?
性能测试具体可以细分为性能测试、负载测试、压力测试、稳定性测试。
1)性能测试
以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内是否能达到预期。
2)负载测试
对系统不断增加并发请求以增加系统压力,直到系统的某项或多项性能指标达到安全临界值,这时继续对系统施加压力,系统的处理能力不但不会提高,反而会下降。
3)压力测试
超过安全负载的情况下,对系统施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力。
4)稳定性测试
被测试系统在特定硬件、软件、网络环境条件下,给系统加载一定业务压力,使系统运行一段较长时间,以此检验系统是否稳定。
3. 怎么进行压力测试?
压力测试工具有http_load、apache ab、siege。
1)http_load
下载:http://acme.com/software/http_load/(点击Fetch the software即可)
安装:
tar zxvf http_load-09Mar2016.tar.gz
cd http_load-09Mar2016
make
sudo make install
注:遇到了Error1,但不影响使用。
(2017.9.12整理笔记时,又尝试了一下,发现可以用Homebrew安装http_load,当时怎么没想到用Homebrew安装啊。。。😑)
命令格式:
http_load -p 并发访问进程数 -f 访问总数 需要访问的URL文件
http_load -r 每秒访问频率 -s 访问时间 需要访问的URL文件
// 参数说明:通常参数pf一起使用,参数rs一起使用。
-parallel 简写 -p :并发的用户进程数。
-fetches 简写 -f : 总计的访问次数。
-rate 简写 -r : 每秒的访问频率。
-seconds 简写 -s :总计的访问时间。
使用:
新建一个urls.txt,urls.txt 是一个url 列表,每个url 单独的一行。
在文件中加入一行:http://www.acme.com/software/http_load/
① 测试网站是否能承受住预期的访问压力
执行http_load -rate 5 -seconds 10 urls.txt,含义为在10秒内保持一定的频率访问目标url。
结果分析:
48 fetches, 6 max parallel, 253264 bytes, in 10.0031 seconds // 说明在上面的测试中运行了48个请求,最大的并发进程数是6,总计传输的数据是253264bytes,运行的时间是10.0031秒 5276.33 mean bytes/connection // 说明每次连接平均传输的数据量是5276.33bytes。253264/48=5276.33 4.7985 fetches/sec, 25318.5 bytes/sec // 说明每秒的响应请求为4.7985个,每秒传递的数据为25318.5 bytes msecs/connect: 251.601 mean, 1493.45 max, 26.176 min // 说明每次连接的平均响应时间是251.601 毫秒,最大的响应时间1493.45 毫秒,最小的响应时间26.176 毫秒 msecs/first-response: 232.251 mean, 796.783 max, 39.402 min // 说明每次连接的平均返回时间是232.251 毫秒,最大的响应时间796.783 毫秒,最小的响应时间39.402 毫秒 HTTP response codes: code 200 -- 48 // 说明HTTP返回码是200,一共48次。 主要参考fetches/sec、msecs/connect数值, 前者对应QPS,表示每秒的响应请求数,后者对应response time,表示每个连接的响应时间。
② 测试网站每秒所能承受的平均访问量
执行http_load -parallel 5 -fetches 1000 urls.txt,含义为同时使用5个进程,随机访问urls.txt中的网址列表,总共访问1000次。
结果分析:
1000 fetches, 5 max parallel, 2。607e+06 bytes, in 328.806 seconds 2607 mean bytes/connection 3.04131 fetches/sec, 7928.69 bytes/sec msecs/connect: 772.326 mean, 19478.3 max, 219.936 min msecs/first-response: 830.46 mean, 10006.4 max, 237.957 min HTTP response codes: code 200 — 1000 从上面结果看,目标网站仅仅能够承受每秒3次的访问,不够强壮。
2)apache ab
ab是Apache自带的压力测试工具,可以用which ab查看ab命令所在的目录。
命令格式:
ab -c 并发数 -n 请求数 URL // 参数说明: -n 在测试会话中所执行的请求个数。默认时,仅执行一个请求 -c 一次产生的请求个数。默认是一次一个。 -t 测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
使用:
执行ab -n 100 -c 100 http://127.0.0.1/test/test.php,含义为同时处理100个请求并运行100次test.php,模拟100个并发用户,对一个页面发送100个请求。
结果分析:
Server Software: Apache/2.4.23 // 服务器名称,apache 版本2.4.23 Server Hostname: 127.0.0.1 // 服务器主机名 Server Port: 80 // 服务器端口 Document Path: /test/test.php // 请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型 Document Length: 54 bytes // HTTP响应数据的正文长度 Concurrency Level: 100 // 并发用户数 Time taken for tests: 0.085 seconds // 整个测试持续的时间,所有这些请求被处理完成所花费的总时间 Complete requests: 100 // 完成的请求数量 Failed requests: 0 // 失败的请求数量 Total transferred: 25600 bytes // 所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度 HTML transferred: 5400 bytes // 所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。 Requests per second: 1177.59 [#/sec] (mean) // 吞吐率,计算公式:Complete requests/Time taken for tests。相当于每秒事务数,后面括号中的 mean 表示这是一个平均值。吞吐率越高,服务器性能越好。 Time per request: 84.919 [ms] (mean) // 用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。相当于平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值。 Time per request: 0.849 [ms] (mean, across all concurrent requests) // 服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level。 Transfer rate: 294.40 [Kbytes/sec] received //这些请求在单位时间内从服务器获取的数据长度,即平均每秒网络上的流量,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题。 Connection Times (ms) min mean[+/-sd] median max Connect: 1 2 0.4 2 3 Processing: 6 44 23.4 46 81 Waiting: 6 44 23.5 46 81 Total: 8 46 23.1 47 82 // 网络上消耗的时间的分解 Percentage of the requests served within a certain time (ms) 50% 47 66% 60 75% 66 80% 72 90% 76 95% 80 98% 82 99% 82 100% 82 (longest request) // 这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,66%的请求处理时间都不超过60ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。
并发请求量稍微高一点(200,300以上)就会报apr_socket_recv: Connection reset by peer 的错。
3)siege
安装:从http://download.joedog.org/siege/下载的siege包make && make install 失败,改用Homebrew安装
命令格式:
siege -c 并发数 -t 运行测试时间 URL siege -c 并发量 -r 重复次数 -f URL // 参数说明:-r和-t一般不同时使用 -c 200 指定并发数200 -r 5 指定测试的次数5 -t 5 持续测试5分钟,-t如果不带单位,默认是分钟,s表示秒。 -f urls.txt 指定url的文件 -i internet的简写,随机发送url -b 请求无需等待 delay=0
使用:
执行siege -c 10 -r 5 -f urllist.txt,含义为10个并发对urllist文件发送请求5次。
(-----中间滚屏略-----)
结果分析:
Transactions: 300 hits // 总共测试次数,完成300次处理 Availability: 100.00 % // 成功次数百分比,100.00 % 成功率 Elapsed time: 31.36 secs // 总共用时31.36秒 Data transferred: 0.43 MB // 共数据传输0.43 MB Response time: 0.90 secs // 响应用时0.90秒 Transaction rate: 9.57 trans/sec // 平均每秒完成 9.57 次处理 Throughput: 0.01 MB/sec // 吞吐率,平均每秒传送数据 Concurrency: 8.62 // 最高并发数 Successful transactions: 250 // 成功请求数 Failed transactions: 0 // 失败请求数 Longest transaction: 3.66 // 每次传输所花最长时间 Shortest transaction: 0.50 // 每次传输所花最短时间