架构师训练营第七周作业
发布于: 2020 年 07 月 21 日
以下两题,至少选做一题
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com
1.java程序
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.*;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.stream.LongStream;public class LoadRunner { private int concurrentCount; private int requestCount; private String url; private CountDownLatch start; private CountDownLatch end; private List<Long> timeCountList; /** * @param url 请求URL * @param concurrentCount 并发数 * @param requestCount 请求总数 */ public LoadRunner(String url, int concurrentCount, int requestCount) { this.url = url; this.concurrentCount = concurrentCount; this.requestCount = requestCount; timeCountList = new ArrayList<>(requestCount); start = new CountDownLatch(1); end = new CountDownLatch(this.requestCount); } /** 执行压力测试 * @throws InterruptedException */ public void run() throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(concurrentCount); for (int i = 0; i < requestCount; i++) { Runnable runnable = new Task(i); executorService.submit(runnable); } start.countDown(); end.await(); executorService.shutdown(); } /** * 输出总时间,平均响应时间,95% 响应时间 */ public void display() { double avg = timeCountList.stream().mapToDouble(p->p.longValue()).average().getAsDouble(); long sumTime = timeCountList.stream().flatMapToLong(t -> LongStream.of(t.longValue())).sum(); System.out.println(String.format("总耗时:%dms, 平均时间:%.2fms,95%%响应时间:%dms", sumTime, avg, timeCountList.get((int)Math.ceil(0.95*timeCountList.size())))); } private class Task implements Runnable { private int number; /** * @param number 线程编号 */ public Task(int number) { this.number = number; } @Override public void run() { long startTime = System.currentTimeMillis(); long endTime; try { start.await(); URL urlContext = new URL(url); HttpURLConnection connection = (HttpURLConnection) urlContext.openConnection(); InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } endTime = System.currentTimeMillis(); long interval = endTime - startTime; System.out.println(String.format("Thread %d success, 耗时 %dms", number, interval, stringBuilder.toString())); timeCountList.add(interval); } catch (Exception e) { endTime = System.currentTimeMillis(); long interval = endTime - startTime; timeCountList.add(interval); System.out.println(String.format("Thread %d failure , 耗时 %dms ", number, interval, e.getMessage())); } finally { end.countDown(); } } }}
2.压力测试
public static void main(String[] args) throws InterruptedException { LoadRunner runner = new LoadRunner("http://www.baidu.com.cn/", 10, 100); runner.run(); runner.display(); }
3.测试结果
Thread 3 success, 耗时 136msThread 9 success, 耗时 135msThread 4 success, 耗时 136msThread 1 success, 耗时 136msThread 7 success, 耗时 135msThread 0 success, 耗时 136msThread 2 success, 耗时 138msThread 6 success, 耗时 137msThread 5 success, 耗时 137msThread 13 success, 耗时 33msThread 12 success, 耗时 33msThread 14 success, 耗时 33msThread 10 success, 耗时 34msThread 11 success, 耗时 36msThread 17 success, 耗时 64msThread 19 success, 耗时 32msThread 20 success, 耗时 34msThread 21 success, 耗时 33msThread 22 success, 耗时 33msThread 18 success, 耗时 69msThread 23 success, 耗时 34msThread 16 success, 耗时 71msThread 15 success, 耗时 72msThread 8 success, 耗时 229msThread 24 success, 耗时 33msThread 25 success, 耗时 32msThread 27 success, 耗时 33msThread 28 success, 耗时 32msThread 26 success, 耗时 34msThread 29 success, 耗时 35msThread 31 success, 耗时 34msThread 30 success, 耗时 35msThread 32 success, 耗时 35msThread 33 success, 耗时 37msThread 35 success, 耗时 32msThread 34 success, 耗时 32msThread 36 success, 耗时 33msThread 37 success, 耗时 33msThread 38 success, 耗时 33msThread 39 success, 耗时 35msThread 41 success, 耗时 35msThread 40 success, 耗时 36msThread 42 success, 耗时 34msThread 43 success, 耗时 37msThread 45 success, 耗时 31msThread 44 success, 耗时 33msThread 46 success, 耗时 32msThread 47 success, 耗时 33msThread 48 success, 耗时 32msThread 49 success, 耗时 33msThread 50 success, 耗时 34msThread 52 success, 耗时 35msThread 53 success, 耗时 35msThread 51 success, 耗时 46msThread 54 success, 耗时 32msThread 55 success, 耗时 31msThread 56 success, 耗时 31msThread 57 success, 耗时 32msThread 58 success, 耗时 35msThread 59 success, 耗时 33msThread 60 success, 耗时 33msThread 61 success, 耗时 35msThread 62 success, 耗时 36msThread 63 success, 耗时 36msThread 64 success, 耗时 31msThread 65 success, 耗时 32msThread 66 success, 耗时 32msThread 67 success, 耗时 32msThread 68 success, 耗时 33msThread 69 success, 耗时 34msThread 70 success, 耗时 34msThread 71 success, 耗时 35msThread 74 success, 耗时 32msThread 75 success, 耗时 31msThread 72 success, 耗时 36msThread 76 success, 耗时 31msThread 73 success, 耗时 38msThread 77 success, 耗时 32msThread 78 success, 耗时 33msThread 79 success, 耗时 35msThread 80 success, 耗时 34msThread 81 success, 耗时 38msThread 83 success, 耗时 31msThread 82 success, 耗时 32msThread 85 success, 耗时 32msThread 84 success, 耗时 35msThread 86 success, 耗时 33msThread 88 success, 耗时 33msThread 87 success, 耗时 40msThread 89 success, 耗时 34msThread 90 success, 耗时 34msThread 92 success, 耗时 31msThread 93 success, 耗时 32msThread 94 success, 耗时 31msThread 91 success, 耗时 37msThread 95 success, 耗时 34msThread 96 success, 耗时 33msThread 97 success, 耗时 34msThread 98 success, 耗时 39msThread 99 success, 耗时 35ms总耗时:4637ms, 平均时间:46.37ms,95%响应时间:34ms
划线
评论
复制
发布于: 2020 年 07 月 21 日阅读数: 48
版权声明: 本文为 InfoQ 作者【涛】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8650040674311e153647fc3d】。文章转载请联系作者。
涛
关注
还未添加个人签名 2018.04.25 加入
还未添加个人简介
评论