写点什么

架构师训练营第一期 - week7

用户头像
习习
关注
发布于: 2020 年 11 月 05 日

题目





回答



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



并发数和吞吐量的关系:





并发用户数和响应时间的关系:



  • 从 a 点到 b 点之间,表示系统还没达到的设定的目标极限,随着并发数的提升,系统吞吐量也随着提升。表示在系统的处理能力之内。这个期间,系统响应时间几乎是不变的。

  • 从 b 点到 c 点之间,表示在系统安全运行期内,系统吞吐量还在继续提升,但提升速度没有上一个阶段快,而因为可能有某项系统资源已经达到极限,系统响应时间也会随之变长。

  • 从 c 点到 d 点之间,表示并发数到达了系统安全运行的临界值,系统已经达到了处理能力的极限,再极限增加并发数,系统就处理不过来了,导致系统响应时间越来越长,吞吐量也就随着降低。

  • 到达 d 点之后,系统已经崩溃,并发数过大导致系统响应时间无限长,根据公式 吞吐量=(1000/响应时间ms)*并发数 ,系统的吞吐量接近 0



2.用你熟悉的编程语言写一个Web性能压测工具



  • 输入参数:URL,请求总次数,并发数。

  • 输出参数:平均响应时间,95%响应时间。

  • 用这个测试工具以10并发、100次请求压测www.baidu.com



工具方法



package util;
import java.util.List;
public class Util {
/**
* 计算平均响应时间
*
* @param responseTimes 响应时间集合
* @return
*/
public static long responseAvg(List<Long> responseTimes) {
return (long) responseTimes.stream().mapToDouble(x -> x).average().orElse(0);
}
/**
* 计算第95%位置的响应时间
*
* @param responseTimes 响应时间集合
* @return
*/
public static long response95(List<Long> responseTimes) {
long limitedSize = (long) (responseTimes.size() * 0.95);
return responseTimes.stream()
.sorted()
.skip(limitedSize - 1).findFirst().orElse(0L);
}
}



单次发送请求并返回时间



private static long testBaidu() {
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
long beginTime = System.currentTimeMillis();
HttpGet httpget = new HttpGet("https://www.baidu.com/");
HttpResponse httpresponse = httpclient.execute(httpget);
long endTime = System.currentTimeMillis();
return (endTime - beginTime);
} catch (IOException e) {
throw new RuntimeException();
}



并发执行



public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("test-pool-%d").build();
ExecutorService executorService = new ThreadPoolExecutor(
10,
10,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(128),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy());
List<Future<Long>> futures = new ArrayList<>();
List<Long> responseTimes = new ArrayList<>();
for (int i = 0; i < 100; i++) {
futures.add(executorService.submit(Baidu::testBaidu));
}
for (Future<Long> future : futures) {
if (null != future.get()) {
responseTimes.add(future.get());
}
}
System.out.println("平均响应时间 " + Util.responseAvg(responseTimes) + "ms");
System.out.println("95%响应时间 " + Util.response95(responseTimes) + "ms");



结果





用户头像

习习

关注

还未添加个人签名 2018.08.08 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第一期 - week7