写点什么

架构师训练营 -week07- 作业

用户头像
大刘
关注
发布于: 2020 年 11 月 06 日
架构师训练营 -week07-作业
  1. 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

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




作业1.

响应时间:指应用系统从发出请求开始,到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直观的反映了系统的“快慢”。一般来说,随着并发数增大,单个用户的响应时间通常会随之增加。



吞吐量:指单位时间内系统处理的请求的数量,体现系统的处理能力。对于网站,可以用“请求数/秒”或是“页面数/秒”来衡量,也可以用“访问人数/天”或者“处理的业务数/小时”等来衡量。TPS(每秒事务数)也是吞吐量的一个指标,此外还有HPS(每秒HTTP请求数),QPS(每秒查询数)等。

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



  1. 在最佳运行区间内(下图左边区域),系统响应时间增加幅度较为缓慢,吞吐量接近线性增长。

  2. 在最佳运行区间之后(下图中间区域),系统最大负载点之前,系统响应时间增长较快,吞吐量增长变慢,此时已经是比较危险的运行区域了,通常会有告警信息出现。

  3. 在系统最大负载点之后,系统响应时间显著增长,吞吐量逐步下降,一直到系统奔溃。





作业2.
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
public class HttpStressTest {
public static Map<String, Long> hashMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
long start = System.currentTimeMillis();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
long startTime = System.currentTimeMillis();
int statusCode = 0;
try {
//使用apache的httpclient包,向指定URL发送请求
statusCode = doGetSimple("http://www.baidu.com");
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
long useTime = endTime - startTime;
System.out.print("useTime" + useTime + " ");
System.out.println();
hashMap.put(UUID.randomUUID().toString(), useTime);
}
});
}
fixedThreadPool.shutdown();
while (true) {
if (fixedThreadPool.isTerminated()) {
System.out.println((System.currentTimeMillis() - start) + "ms");
System.out.println("执行完毕");
AtomicReference<Long> allTime = new AtomicReference<>(0l);
List<Long> nineFiveTime = new ArrayList<>();
AtomicInteger i = new AtomicInteger();
hashMap.forEach((k, v) -> {
allTime.updateAndGet(v1 -> v1 + v);
nineFiveTime.add(v);
});
nineFiveTime.sort(Comparator.comparingLong(Long::longValue));
System.out.println("平均响应时间:" + allTime.get() / 100 + "ms");
System.out.println("95%响应时间:" + nineFiveTime.get(95) + "ms");
break;
}
}
}
public static int doGetSimple(String url) throws IOException {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
int result = 0;
// 通过址默认配置创建一个httpClient实例
httpClient = HttpClients.createDefault();
// 创建httpGet远程连接实例
HttpGet httpGet = new HttpGet(url);
// 执行get请求得到返回对象
response = httpClient.execute(httpGet);
result = response.getStatusLine().getStatusCode();
return result;
}
}

输出结果:

平均响应时间:185ms
95%响应时间:1708ms



用户头像

大刘

关注

大道至简,知易行难 2017.12.27 加入

想成为合格架构师的架构师

评论

发布
暂无评论
架构师训练营 -week07-作业