网络服务性能相关概念
服务器平均请求处理时间(Time per request: across all concurrent requests)
即是在某个并发用户数下服务器处理一条请求的平均时间
服务器平均请求处理时间 = 处理完成所有请求数所花费的时间 / 总请求数
Time per request(across all concurrent requests) = Time taken for / testsComplete requests
用户平均请求等待时间(Time per request)
即是用户获得相应的平均等待时间
用户平均请求等待时间 = 处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)
吞吐率(Requests per second,QPS,RPS)
即是在某个并发用户数下单位时间内处理的请求数,单位是reqs/s, 也是 “服务器平均请求处理时间” d的倒数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
吞吐率 = 总请求数 / 处理完成这些请求数所花费的时间
Request per second = Complete requests / Time taken for tests
并发连接数(The number of concurrent connections)
即是在某个时刻服务器所接受的请求数目,就是会话数量。
并发用户数(The number of concurrent users,Concurrency Level)
即是指某个时刻使用系统的用户数(可能有一个用户有一个或者多个连接)。
要注意区分和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
总结:
如果要说QPS时,一定需要指明是多少并发用户数下的QPS,否则豪无意义。
因为单用户数的40QPS和20并发用户数下的40QPS是两个不同的概念,前者说明该服务可以在一秒内串行执行40个请求,而后者说明在并发20个请求的情况下,一秒内该应用能处理40个请求。
当QPS相同时,越大的并发用户数,说明了网站服务并发处理能力越好。
对于当前的web服务器,其处理单个用户的请求肯定戳戳有余,这个时候会存在资源浪费的情况(一方面该服务器可能有多个cpu,但是只处理单个进程,另一方面,在处理一个进程中,有些阶段可能是IO阶段,这个时候会造成CPU等待,但是有没有其他请求进程可以被处理)。
而当并发数设置的过大时,每秒钟都会有很多请求需要处理,会造成进程(线程)频繁切换,反正真正用于处理请求的时间变少,每秒能够处理的请求数反而变少,同时用户的请求等待时间也会变大,甚至超过用户的心理底线,等待时间过长。
所以在最小并发数和最大并发数之间,一定有一个最合适的并发数值,在并发数下,QPS能够达到最大。
但是,这个并发并非是一个最佳的并发,因为当QPS到达最大时的并发,可能已经造成用户的等待时间变得超过了其最优值,所以对于一个系统,其最佳的并发数,一定需要结合QPS,用户的等待时间来综合确定。
下面这张图是应用服务器关于并发用户数,QPS,用户平均等待时间的一张关系图,对于实际的系统,也应该是对于不同的并发数,进行多次测试,获取到这些数值后,画出这样一张图出来,以便于分析出系统的最佳并发用户数。
响应时间关系图
ab 简介和使用实例
简介
ab全称为:apache bench
它是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。
我们可以直接安装apache的工具包httpd-tools。如下:1
yum -y install httpd-tools
使用ab –V命令检测是否安装成功。如下:1
ab -V
实例
1 | ab -n 100 -c 10 -H "token: fioj3iorm2aoi4ej" -p /data/postdata.txt -T application/x-www-form-urlencoded "http://127.0.0.1/test" |
上面命令的含义是
设置请求header中参数token = fioj3iorm2aoi4ej,向 http://127.0.0.1/test 地址发送POST请求,POST表单数据存放在
本地文件/data/postdata.txt中,其content-type格式为 application/x-www-form-urlencoded,发送的并发请求数为 10,总请求数为 100。
成功后返回:
测试结果含义
返回值名称 | 含义 |
---|---|
Server Software | web服务器软件及版本 |
Server Hostname | 表示请求的URL中的主机部分名称 |
Server Port | 被测试的Web服务器的监听端口 |
Document Path | 请求的页面路径 |
Document Length | 页面大小 |
Concurrency Level | 并发请求数 |
Time taken for tests | 整个测试持续的时间,测试总共花费的时间 |
Complete requests | 完成的请求数 |
Failed requests | 失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求。 |
Write errors | 写入错误 |
Total transferred | 总共传输字节数,整个场景中的网络传输量,包含http的头信息等。使用ab的-v参数即可查看详细的http头信息。 |
HTML transferred | html字节数,整个场景中的HTML内容传输量。也就是减去了Total transferred中http响应数据中头信息的长度。 |
Requests per second | 每秒处理的请求数,服务器的吞吐量,大家最关心的指标之一 |
Time per request | 用户平均请求等待时间,大家最关心的指标之二 |
Time per request | 服务器平均处理时间,大家最关心的指标之三 |
Transfer rate | 平均传输速率(每秒收到的速率)平均每秒网络上的流量,可以很好的说明服务器在处理能力达到限制时,其出口带宽的需求量,也可以帮助排除是否存在网络流量过大导致响应时间延长的问题。 |
下面段表示网络上消耗的时间的分解
下面这段是每个请求处理时间的分布情况,50%的处理时间在4930ms内,66%的处理时间在5008ms内…,重要的是看90%的处理时间。
常见问题
压力测试需要当登录怎么办?
1、先用账户和密码在浏览器登录后,用开发者工具找到会话的Cookie值(Session ID)记下来。
2、使用下面命令传入Cookie值1
ab -n 100 -C key=value http://127.0.0.1/test