写点什么

架构师训练营第七周作业

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

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

稳定性测试

被测试系统在特定硬件、软件、网络环境条件下,给系统加载一定业务压

力,使系统运行一段较长时间,以此检测系统是否稳定。在生产环境,请求压力是不均

匀的,呈波浪特性,因此为了更好地模拟生产环境,稳定性测试也应不均匀地对系统施

加压力。

系统吞吐量变化


系统响应时间变化


在 a 到 b 的时间段,系统还没有达到预期的并发压力值,所以这个期间的响应时间基本没有变化,吞吐量处于一个直线上身的区间,这个区间是系统的最佳运行区间,这里可以知道系统的最佳运行点;

在 b 到 c 的时间段,这个时候系统已经有了一定的压力,并且某些系统资源出现的瓶颈,所以会导致这个区间的响应时间有了一定程度的增加,而吞吐量只有很小程度的增加,这一过程会使得系统的压力越来越大,但是还是系统的安全运行区间,这里可以知道系统的最大负载点;

在 c 到 d 的时间段,这个时候系统已经进入了系统最大的负载点,继续增大并发压力,会使响应时间大幅度增加,吞吐量反而会降低,这主要是应为系统资源的耗尽导致的,这一时间段最后会以系统崩溃结束,这里可以知道系统崩溃点;


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

import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.concurrent.*;
/** * 类说明:用你熟悉的编程语言写一个Web性能压测工具, * 输入参数:URL,请求总次数,并发数。 * 输出参数:平均响应时间,95%响应时间。 * 用这个测试工具以10并发、100次请求压测www.baidu.com。 */public class PerformanceTesting {
private static String urlStr; private static long[] array; private static List<Future> list; private static int queryCount; private static int concurrentCount; private static CyclicBarrier cyclicBarrier; private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000); private static ExecutorService executor = new ThreadPoolExecutor(20,20,60, TimeUnit.SECONDS, queue); public PerformanceTesting(String url, int queryNumber,int concurrentNumber){ urlStr = url; queryCount = queryNumber; concurrentCount = concurrentNumber; array = new long[queryCount*concurrentNumber]; list = new ArrayList<>(queryCount*concurrentNumber); cyclicBarrier = new CyclicBarrier(concurrentCount); }

public void test() throws ExecutionException, InterruptedException { for (int i = 0; i < queryCount; i++) { for (int j = 0; j < concurrentCount; j++) { Callable<Long> callable = new Callable<Long>() { @Override public Long call() throws Exception { cyclicBarrier.await(); long begin = System.currentTimeMillis(); URL url = new URL(urlStr); URLConnection urlConnection = url.openConnection(); urlConnection.connect(); String result = ""; try (BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));) { String line; while ((line = in.readLine()) != null) { result += line; } } long useTime = System.currentTimeMillis() - begin; return useTime; } }; Future future = executor.submit(callable); list.add(future); } } long allUseTime = 0; for (int i = 0; i < concurrentCount; i++) { array[i] = (Long)list.get(i).get(); allUseTime += array[i]; } Arrays.sort(array); int index = (int) (queryCount * concurrentCount * 0.95); System.out.println("=================================="); System.out.println("平均响应时间:" + allUseTime/(queryCount * concurrentCount) + " millis"); System.out.println("95%响应时间:" + array[index] + " millis"); System.out.println("=================================="); executor.shutdown(); }


public static void main(String[] args) throws ExecutionException, InterruptedException { PerformanceTesting test = new PerformanceTesting("http://www.baidu.com", 100, 10); test.test(); }}
复制代码


用户头像

月殇

关注

还未添加个人签名 2019.04.15 加入

还未添加个人简介

评论

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