架构师训练营作业 (第七周)
发布于: 2020 年 07 月 17 日
以下两题,至少选做一题
第一题
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
吞吐量 = 并发数量/系统平均响应时间
随着并发数量的增多,系统响应时间逐渐上升,吞吐量逐渐下降,达到临界点时,系统无响应或者宕机。因为并发数量增加到很大时,每秒钟都会有很多请求需要处理,会造成进程或线程频繁切换,反而真正处理请求的时间变少,造成每秒能够处理的请求数变少,同时请求等待的时间也变大,形成恶性循环。
第二题
用你熟悉的编程语言写一个web性能压测工具,输入参数URL,请求总次数,并发数。输出参数:平均响应时间,95%响应时间。用这个测试工具,以10并发、100次请求压测www.baidu.com
代码github地址: https://gitee.com/bigocean_admin/geek-arch07.git
/** * WEB测试用例 */public class WebTestCase implements Callable<List<Integer>> { /** * 接口URL */ private String url; /** * 每个用户请求数量 */ private int reqCount; public WebTestCase(String url,int reqCount) { this.url = url; this.reqCount = reqCount; } public List<Integer> call() throws Exception { List<Integer> spendTimes = new ArrayList<Integer>(); for(int i = 0;i< reqCount;i++){ Long startMills = System.currentTimeMillis(); String result = httpRequest(url,"GET",null); Long endMills = System.currentTimeMillis(); Long spendTime = endMills - startMills; spendTimes.add(spendTime.intValue()); System.out.println("线程"+Thread.currentThread().getName()+"第"+(i+1)+"次:"+spendTime.intValue()+"ms"); } return spendTimes; } public static String httpRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer buffer = new StringBuffer(); try { URL url = new URL(requestUrl); HttpURLConnection httpUrlConn = (HttpURLConnection)url.openConnection(); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); httpUrlConn.setConnectTimeout(500); httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); if (outputStr != null) { OutputStream outputStream = httpUrlConn.getOutputStream(); outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null){ buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; httpUrlConn.disconnect(); } catch (ConnectException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return buffer.toString(); }}/** * 测试结果 */public class WebTestResult { /** * 平均响应时间 */ private Double avgRespMills; /** * 95%响应时间 */ private Double nintyFivePercentileRespMills; public WebTestResult(Double avgRespMills, Double nintyFivePercentileRespMills) { this.avgRespMills = avgRespMills; this.nintyFivePercentileRespMills = nintyFivePercentileRespMills; } @Override public String toString() { return "WebTestResult{" + "avgRespMills=" + avgRespMills + ", nintyFivePercentileRespMills=" + nintyFivePercentileRespMills + '}'; }}/** * 程序入口 */public class Starter { /** * 程序入口 * @param args */ public static void main(String[] args) { WebTestResult result = test("https://www.baidu.com",10,100); System.out.println(result); } /** * 测试方法 * @param url 测试地址 * @param userCount 用户数量 * @param reqCount 每个用户访问多少次 */ public static WebTestResult test(String url,int userCount,int reqCount){ ExecutorService executorService = Executors.newFixedThreadPool(userCount); CompletionService<List<Integer>> cs = new ExecutorCompletionService<List<Integer>>(executorService); for (int i = 0; i < userCount; i++){ cs.submit(new WebTestCase(url,reqCount)); } double[] timesList = new double[userCount * reqCount]; int index = 0; for (int i = 0; i < userCount; i++) { try { List<Integer> list = cs.take().get(); for(Integer time : list){ timesList[index] = time.doubleValue(); index = index + 1; } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } executorService.shutdown(); Percentile percentile = new Percentile(0.95); double nintyFivepercentile = percentile.evaluate(timesList); Mean mean = new Mean(); // 算术平均值 double average = mean.evaluate(timesList); WebTestResult result = new WebTestResult(average,nintyFivepercentile); return result; }}
划线
评论
复制
发布于: 2020 年 07 月 17 日阅读数: 72
版权声明: 本文为 InfoQ 作者【王海】的原创文章。
原文链接:【http://xie.infoq.cn/article/5e7a9d16b4ed8af306f3116d1】。未经作者许可,禁止转载。
王海
关注
还未添加个人签名 2018.06.17 加入
还未添加个人简介
评论