写点什么

架构师训练营 1 期 - week07- 作业

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

作业一(至少完成一项):

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

被测试系统在特定硬件、软件、网络环境条件下,给系统加载一定业务压力,使系统运行一段较长时间,以此检测系统是否稳定。在生产环境,请求压力是不均匀的,呈波浪特性,因此为了更好地模拟生产环境,稳定性测试也应不均匀地对系统施加压力 ,以下是随着压测是时间累积,TPS和系统响应层度的变化:





性能测试验证是否达到预期的目标,负载测试获取系统安全运行的临界值,压力测试得到系统崩溃的临界值。

  • 从a点到b点之间,表示系统还没达到的设定的目标极限,随着并发数的提升,系统吞吐量也随着提升。表示在系统的处理能力之内。这个期间,系统响应时间几乎是不变的。

  • 从b点到c点之间,表示在系统安全运行期内,系统吞吐量还在继续提升,但提升速度没有上一个阶段快,而因为可能有某项系统资源已经达到极限,系统响应时间也会随之变长。

  • 从c点到d点之间,表示并发数到达了系统安全运行的临界值,系统已经达到了处理能力的极限,再极限增加并发数,系统就处理不过来了,导致系统响应时间越来越长,吞吐量也就随着降低。

  • 到达d点之后,系统已经崩溃,并发数过大导致系统响应时间无限长,根据公式 吞吐量=(1000/响应时间ms)*并发数 ,系统的吞吐量接近0



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);
}
}


平均值:50.41ms

95% 响应时间:401ms



用户头像

lucian

关注

还未添加个人签名 2018.03.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营1期 - week07- 作业