写点什么

架构师训练营第七周作业

用户头像
张明森
关注
发布于: 2020 年 07 月 19 日
  • 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

响应时间:系统响应快慢

并发数:同时请求的用户数

吞吐量:单位时间处理的请求数量


性能测试:

在系统可处理范围内(性能测试):系统资源充足,随着并发数增大,TPS 在增大,响应时间稳定;

负载测试:在资源逐渐饱和,TPS 增长放缓,响应时间缓慢增大;

压力测试:系统资源耗尽,TPS 下降,响应时间增大,系统可能会崩溃

  • 用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。

import java.io.IOException;import java.net.HttpURLConnection;import java.net.URL;import java.util.*;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;
public class WebRunner {
public static void main(String[] args){ String url="http://www.jd.com"; Long totalCount=100L; Long concurrent=10L; WebRunner webRunner=new WebRunner(); webRunner.test(url,totalCount,concurrent); }
/** * * @param url url * @param totalCount 总次数 * @param concurrent 并发数 */ public void test(String url,Long totalCount,Long concurrent){ long perTotalCount=totalCount/concurrent; long lastTotalCount=perTotalCount+totalCount%concurrent; List<FutureTask<List<Long>>> runnerHandlerList=new ArrayList<>(); List<Thread> runnerThreadList=new ArrayList<>(); List<Long> costTimeList=new ArrayList<>(); for(long i=0;i<concurrent;i++){ long runnerTotalCount=i!=totalCount-1?perTotalCount:lastTotalCount; FutureTask<List<Long>> futureTask = new FutureTask<>(new RunnerHandler(url,runnerTotalCount)); Thread thread = new Thread(futureTask); runnerHandlerList.add(futureTask); runnerThreadList.add(thread); } runnerThreadList.parallelStream().forEach(Thread::start); runnerHandlerList.forEach(it->{ try { List<Long> longs=it.get(); costTimeList.addAll(longs); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }); //avg double avg = costTimeList.stream().mapToLong((x) -> x).average().getAsDouble(); System.out.println("平均响应时间:" + avg+"毫秒");
Collections.sort(costTimeList);
Double indexD=(costTimeList.size()*0.95); int index=indexD.intValue()-1; System.out.println("95%响应时间:"+costTimeList.get(index)+"毫秒");
// costTimeList.forEach(it->{// System.out.println(it);// }); }}class RunnerHandler implements Callable<List<Long>>{ private String url; private Long totalCount; public RunnerHandler(String url, Long totalCount){ this.url=url; this.totalCount=totalCount; }
@Override public List<Long> call() throws Exception { List<Long> responseTimeList=new ArrayList<>(); for(long i=0;i<totalCount;i++){ long beginTime=System.currentTimeMillis(); doConnect(this.url); long endTime=System.currentTimeMillis(); long costTime=endTime-beginTime; responseTimeList.add(costTime); } return responseTimeList; } private void doConnect(String httpUrl){ try { URL url = new URL(httpUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置请求方式 connection.setRequestMethod("GET"); //设置连接超时时间 connection.setReadTimeout(15000); //开始连接 connection.connect(); } catch (IOException e) { e.printStackTrace(); } }}
复制代码


平均响应时间:15.51毫秒95%响应时间:51毫秒
复制代码


用户头像

张明森

关注

还未添加个人签名 2017.10.16 加入

还未添加个人简介

评论

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