架构师训练营第七周作业

用户头像
李日盛
关注
发布于: 2020 年 12 月 06 日

一、题目

  1. 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

  2. 用你熟悉的编程语言写一个 Web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。



二、解答

  1. 首先我们要明确,所谓吞吐量这个指标是如何计算的。吞吐量的计算公式如下:

吞吐量=(1000/响应时间ms) * 并发数



从公式上来说,吞吐量和并发数是正相关,和响应时间是负相关。换句话说就是,并发数越大,吞吐量就越高。响应时间越大,吞吐量就越小。也就是说,并发数量越大,响应越快,吞吐量就越大。



从理想的角度来看,假设我们有个完美的系统,无论多大的并发,都能满足响应的时间一致,那么吞吐量就是随着并发数线性增长,图形就如下:





但是实际的情况是,每个系统的性能是受制于硬件和操作系统本身的性能,包括网卡的IO,CPU上下文的切换等等,实际的情况是,随着并发数量的增加,系统的响应时间就会变得越来越长,相关的图形如下:





综合这两个图形,我们就可以得出实际的吞吐量和并发的关系,如下图所示:





网上是有一个经典的图,说明吞吐量和并发数,响应时间的关系:

来源:http://www.ha97.com/5095.html



系统吞吐量评估方法



三、解答二

这个问题的代码实现见如下的gitee地址:https://gitee.com/easonleeone/art-home-work.git



测试结果如下:

====== begin do batch test ======
url:https://www.baidu.com
total:100
batchSize:10
start at:2020-12-06T22:37:52.171
checking finish ..... counts:0
checking finish ..... counts:30
finish at:2020-12-06T22:37:54.196
success total:100
====== finish do batch test ======
total average cost tm: 137.95
95% average cost tm: 123.45263157894736



核心调用代码:

@Test
public void TestBatchHttpGetTest(){
String url = "https://www.baidu.com";
int total = 100;
int batchSize = 10;
BatchHttpTester tester = new BatchHttpTester(url,total,batchSize);
tester.runTest();
System.out.println("total average cost tm: "+ tester.getAverageCostTm());
System.out.println("95% average cost tm: "+ tester.getProportionPCostTm(95));
}



其中,支持1~100百分比的响应时间计算,可以很方便的得出90%线之类的统计数据。

本例子目前只实现了GET的请求部分的压测,用的框架是httpclient.实际的操作过程中,会有部分的请求的结果失败的情况,目前这部分失败的请求是直接抛弃了,后续可以考虑作为异常结果,也计算出来。



发布于: 2020 年 12 月 06 日阅读数: 30
用户头像

李日盛

关注

好架构=低成本+可实现 2018.01.22 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第七周作业