【第七周作业】
本周题目
以下两道题,至少选做一题
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
用你熟悉的编程语言编写一个web性能压力测试工具。
输入参数:URL,请求总次数,并发数
输出参数:平均响应时间,95%响应时间
用这个测试工具以10并发、100次请求测试 www.baidu.com
题目一
性能压测的时候系统的吞吐量会经过出现三个阶段的变化,分别为增长阶段,暂缓增长阶段和下降(崩溃)阶段
增长阶段
这个阶段会随着请求量的增加吞吐量增加。
是由于当前服务的资源都处于空闲状态,进入更多的请求都可以进行处理。
当各种资源的使用率进入提高到一定程度后会进入到下一阶段。
暂缓增长阶段
这个阶段随着请求量的增加吞吐量不会再以线性的趋势进行增长。
是由于当前服务的某一项或多项资源出现的紧缺的情况,多个请求都需要利用资源进行处理的时候就需要其他请求释放此资源才行进行处理(出现资源竞争)。
此时服务会出现响应时间增长的情况。
当等待的资源增多时,就会出现等待超时的情况就会进入到下一阶段。
下降阶段
这个阶段随着请求量的增加吞吐量会下降,并且伴随着请求失败的情况,严重时会出现整个服务无法使用的情况。
是由于没有时间能够分配给等待资源的请求处理,当超过了等待的临界值时就会出现异常(例如线程池等待超时)。或者可能由于资源被占满,再次申请资源时会被拒绝(例如TCP连接池被打满,新的请求会被拒绝)。从而导致整体请求失败的问题。
此时进入到服务部分不可用或完全不可用的状态。
题目二
GitHub地址:APIStressTesting
整体设计思路
本题目主要是利用并发请求的方式对API进行压测请求,并且记录请求的相关数据进行数据分析。
数据请求方面利用工厂模式和模版方法模式实现了请求协议的可扩展
数据分析方面本来是考虑通过红黑树存储所有请求的数据,但是考虑到压测数据可能会量很大,所以就改采用 T-Digital 算法来实现的TP90、TP95和TP99相关的数据。
参考的是 Elasticsearch 在 `percentiles` 百分位数度量的设计。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/percentiles.html
压测数据与分析
压测下来平均响应时间会因为当时网络情况的不同而上下浮动,需要加入多次压测样本综合分析。
公司某子系统压测尝试
性能测试结果如上图,负载测试与压力测试就不放了。
由于是基础服务,之前就做过一些优化,相对来说具体的数据还可以接受,不过还存在可优化空间。
也是通过这个方式检查到我们服务在处理请求时候的关键性能点。
后续要用这个方法试一下我们的WS长连接服务,更新一下具体指标。😋
待改进点
请求方面
可以增加更多测试协议。例如 TCP,UDP,WS等
可以增加更多输入。例如 Header,Body
压力测试方面
可以学习 Redis 的 benchmark,做到开箱即用
可以引入随机参数,以便进行更加模拟用户的操作
数据分析方面
整体数据应该不止是请求响应时间,也需要关注CPU使用率,内存使用率,磁盘使用率,磁盘I/O速率和网络I/O情况的相关指标。(这不是本工具需要输出的内容,而是压力测试报告需要输出的内容)
输出吞吐量指标,可以通过测试数据输出具体压力测试指标与数据拐点
可以输出具体测试的CSV文件,例如分析具体数据和输出图表
可以为各个请求协议为维度输出具体的数据。例如 HTTP请求输出 DNS 检索时间等。
https://redis.io/topics/benchmarks
评论