写点什么

架构师训练营第 1 期 week7

用户头像
张建亮
关注
发布于: 2020 年 11 月 08 日

1、性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

在并发压力刚开始增加的时候,吞吐量会越来越大,响应时间小幅增长,因为服务器有足够的资源,并发越多,单位时间处理的事务越多,吞吐量越大,当增加到一个程度后,再增加的话有部分线程需要等待了,所以响应时间开始加快增长,吞吐量的增长变缓,超过某个值后再继续增加的话服务器处理不过来了,响应时间越来越长了,吞吐量也开始减少。

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

import cn.hutool.http.HttpUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;

public class PerformanceTest {
public static List<Long> resultlist = new ArrayList<Long>();
public static ReentrantLock lock = new ReentrantLock();

/**
* 性能测试
* @param url 测试地址
* @param requestNum 请求总次数
* @param concurrencyNum 并发数
*/
public static void test(String url,int requestNum,int concurrencyNum){
BlockingQueue<Runnable> blockingQueue=new ArrayBlockingQueue<Runnable>(requestNum);
ThreadPoolExecutor pool=new ThreadPoolExecutor(concurrencyNum,concurrencyNum,3, TimeUnit.MILLISECONDS,blockingQueue);
CountDownLatch countDown = new CountDownLatch(requestNum);
for(int i=0;i<requestNum;i++){
pool.execute(()->{
Long start = System.currentTimeMillis();
HttpUtil.get(url);
Long end = System.currentTimeMillis();
lock.lock();
resultlist.add(end-start);
lock.unlock();
countDown.countDown();
});
}
try {
countDown.await();
System.out.println("平均值:"+resultlist.stream().mapToLong(Long::longValue).average().orElse(0)+"ms");
resultlist = resultlist.stream().sorted().collect(Collectors.toList());
int per_95 = (int)( requestNum * 0.95);
System.out.println("95% 响应时间:"+resultlist.get(per_95-1)+"ms");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
test("www.baidu.com",100,10);
}
}


平均值:52.43ms

95% 响应时间:401ms

单个线程第一次访问时响应时间稍微长点,后面多次访问时间会很快,开了10个线程,所以95%的响应时间值很大



用户头像

张建亮

关注

还未添加个人签名 2020.07.29 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 1 期 week7