架构师训练营 week7 作业
发布于: 2020 年 07 月 22 日
1.性能压测的时候,随着并发压力的增加,系统的响应时间和吞吐量如何变化?为什么?
随着并发压力的增加,系统的响应时间在系统的性能承受能力的临界点之内速度不会有太大变化,吞吐量则会增加,单位时间内系统处理的请求变多了。当随着并发压力变大到系统性能承受能力的临界点之外时,系统响应时间变慢,因为创建的线程数已经超出系统能承受的范围内,且线程切换上下文也会耗费资源,吞吐量随之下降。
2.用你熟悉的语言写一个web性能压测工具,输入参数:url,请求总次数,并发数。输出参数:平均响应时间,95%响应时间。用这个测试工具以10并发、100次请求压测:www.baidu.com
package cn.geekshell.utils;import com.sun.javafx.binding.StringFormatter;import org.apache.hc.client5.http.fluent.Request;import org.apache.hc.core5.http.HttpResponse;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.*;public class PerformanceTestUtil { public static String startTest(String url,Integer requestCount,Integer concurrentCount) throws InterruptedException { List<Long> responseTimeList = new ArrayList<Long>(requestCount); ExecutorService executorService = Executors.newFixedThreadPool(concurrentCount); List<Callable<String>> tasks = new ArrayList<>(concurrentCount); for (int i = 0; i < requestCount; i = i+concurrentCount ){ int finalI = i; for(int j = 0; j < concurrentCount; j++){ int finalJ = j; tasks.add(() -> { long start = System.currentTimeMillis(); try { HttpResponse response = Request.get(url).execute().returnResponse(); long end = System.currentTimeMillis(); responseTimeList.add(end - start); if (response.getCode() == 200) { return "响应成功:" + finalI + finalJ; } else { return "响应失败:" + finalI + finalJ; } } catch (Exception e) { long end = System.currentTimeMillis(); responseTimeList.add(end - start); e.printStackTrace(); return "响应失败:" + finalI + finalJ; } }); } executorService.invokeAll(tasks).stream() .map(future -> { try { return future.get(); } catch (Exception e) { throw new IllegalStateException(e); } }) .forEach(System.out::println); tasks.clear(); } executorService.shutdown(); try { executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { } return String.format("请求网址:%s, 请求总数:%d, 请求并发数:%d,平均响应时间: %.2f,95%%响应时间 :%.2f", url,(int)requestCount,(int)concurrentCount,average(responseTimeList),percentileResponseTime(responseTimeList,0.95)); } private static double percentileResponseTime(List<Long> list,double p){ int size = list.size(); Collections.sort(list); double px = p*(size-1); int i = (int)java.lang.Math.floor(px); double g = px - i; if(g==0){ return list.get(0); }else{ return (1 - g) * list.get(i) + g * list.get(i+1); } } private static double average(List<Long> responseTime){ if (responseTime != null){ double total = responseTime.stream().mapToDouble(time -> time).sum(); return total / responseTime.size(); } return 0; } public static void main(String[] args) throws InterruptedException { String result = PerformanceTestUtil.startTest("http://www.baidu.com", 100, 10); System.out.println(result); }}
输出:请求网址:http://www.baidu.com, 请求总数:100, 请求并发数:10,平均响应时间: 117.91,95%响应时间 :382.00
划线
评论
复制
发布于: 2020 年 07 月 22 日阅读数: 62
小叶
关注
还未添加个人签名 2018.10.21 加入
还未添加个人简介
评论