写点什么

架构师训练营第七周作业

用户头像
关注
发布于: 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, 耗时 136ms
Thread 9 success, 耗时 135ms
Thread 4 success, 耗时 136ms
Thread 1 success, 耗时 136ms
Thread 7 success, 耗时 135ms
Thread 0 success, 耗时 136ms
Thread 2 success, 耗时 138ms
Thread 6 success, 耗时 137ms
Thread 5 success, 耗时 137ms
Thread 13 success, 耗时 33ms
Thread 12 success, 耗时 33ms
Thread 14 success, 耗时 33ms
Thread 10 success, 耗时 34ms
Thread 11 success, 耗时 36ms
Thread 17 success, 耗时 64ms
Thread 19 success, 耗时 32ms
Thread 20 success, 耗时 34ms
Thread 21 success, 耗时 33ms
Thread 22 success, 耗时 33ms
Thread 18 success, 耗时 69ms
Thread 23 success, 耗时 34ms
Thread 16 success, 耗时 71ms
Thread 15 success, 耗时 72ms
Thread 8 success, 耗时 229ms
Thread 24 success, 耗时 33ms
Thread 25 success, 耗时 32ms
Thread 27 success, 耗时 33ms
Thread 28 success, 耗时 32ms
Thread 26 success, 耗时 34ms
Thread 29 success, 耗时 35ms
Thread 31 success, 耗时 34ms
Thread 30 success, 耗时 35ms
Thread 32 success, 耗时 35ms
Thread 33 success, 耗时 37ms
Thread 35 success, 耗时 32ms
Thread 34 success, 耗时 32ms
Thread 36 success, 耗时 33ms
Thread 37 success, 耗时 33ms
Thread 38 success, 耗时 33ms
Thread 39 success, 耗时 35ms
Thread 41 success, 耗时 35ms
Thread 40 success, 耗时 36ms
Thread 42 success, 耗时 34ms
Thread 43 success, 耗时 37ms
Thread 45 success, 耗时 31ms
Thread 44 success, 耗时 33ms
Thread 46 success, 耗时 32ms
Thread 47 success, 耗时 33ms
Thread 48 success, 耗时 32ms
Thread 49 success, 耗时 33ms
Thread 50 success, 耗时 34ms
Thread 52 success, 耗时 35ms
Thread 53 success, 耗时 35ms
Thread 51 success, 耗时 46ms
Thread 54 success, 耗时 32ms
Thread 55 success, 耗时 31ms
Thread 56 success, 耗时 31ms
Thread 57 success, 耗时 32ms
Thread 58 success, 耗时 35ms
Thread 59 success, 耗时 33ms
Thread 60 success, 耗时 33ms
Thread 61 success, 耗时 35ms
Thread 62 success, 耗时 36ms
Thread 63 success, 耗时 36ms
Thread 64 success, 耗时 31ms
Thread 65 success, 耗时 32ms
Thread 66 success, 耗时 32ms
Thread 67 success, 耗时 32ms
Thread 68 success, 耗时 33ms
Thread 69 success, 耗时 34ms
Thread 70 success, 耗时 34ms
Thread 71 success, 耗时 35ms
Thread 74 success, 耗时 32ms
Thread 75 success, 耗时 31ms
Thread 72 success, 耗时 36ms
Thread 76 success, 耗时 31ms
Thread 73 success, 耗时 38ms
Thread 77 success, 耗时 32ms
Thread 78 success, 耗时 33ms
Thread 79 success, 耗时 35ms
Thread 80 success, 耗时 34ms
Thread 81 success, 耗时 38ms
Thread 83 success, 耗时 31ms
Thread 82 success, 耗时 32ms
Thread 85 success, 耗时 32ms
Thread 84 success, 耗时 35ms
Thread 86 success, 耗时 33ms
Thread 88 success, 耗时 33ms
Thread 87 success, 耗时 40ms
Thread 89 success, 耗时 34ms
Thread 90 success, 耗时 34ms
Thread 92 success, 耗时 31ms
Thread 93 success, 耗时 32ms
Thread 94 success, 耗时 31ms
Thread 91 success, 耗时 37ms
Thread 95 success, 耗时 34ms
Thread 96 success, 耗时 33ms
Thread 97 success, 耗时 34ms
Thread 98 success, 耗时 39ms
Thread 99 success, 耗时 35ms
总耗时:4637ms, 平均时间:46.37ms,95%响应时间:34ms



发布于: 2020 年 07 月 21 日阅读数: 48
用户头像

关注

还未添加个人签名 2018.04.25 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第七周作业