架构师训练营第七周作业
发布于: 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毫秒
复制代码
划线
评论
复制
发布于: 2020 年 07 月 19 日阅读数: 53
张明森
关注
还未添加个人签名 2017.10.16 加入
还未添加个人简介
评论