写点什么

架构师训练营作业 (第七周)

用户头像
王海
关注
发布于: 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
用户头像

王海

关注

还未添加个人签名 2018.06.17 加入

还未添加个人简介

评论

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