架构师训练营 - 第⑦周命题作业
发布于: 2020 年 07 月 19 日
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
一开始,响应时间几乎保持不变或缓慢增加,吞吐量快速提升,这时系统的软硬件性能利用率逐渐提高;
随着并发压力继续增大,当系统的某项或多项指标达到安全临界点时,由于资源请求冲突增加,导致系统运行效率下降。响应时间快速增加,导致吞吐量下降;
压力继续增大会导致系统宕机不可用
用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
package performance;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @description: 性能测试工具 * @author: liu.w * @create: 2020-07-17 11:19 **/public class PerformanceTest { private static final String HTTP_WWW_BAIDU_COM_CN = "http://www.baidu.com.cn"; public static void main(String[] args) { List<Long> data = runTask(10, 100); System.out.println("avg: " + data.stream().mapToLong(Long::intValue).average().getAsDouble()); Collections.sort(data); int index = (int) (data.size() * 0.95) - 1; System.out.println("95%: " + data.get(index)); } /** * @param threadCount 线程数 * @param times 执行次数 * @return */ private static List<Long> runTask(int threadCount, int times) { ExecutorService service = Executors.newFixedThreadPool(15); final List<Long> data = Collections.synchronizedList(new ArrayList<>()); final CountDownLatch cdOrder = new CountDownLatch(1); final CountDownLatch cdAnswer = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { service.submit(() -> { try { cdOrder.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "开始执行"); for (int j = 0; j < times; j++) { long beginTime = System.currentTimeMillis(); try { URL url = new URL(HTTP_WWW_BAIDU_COM_CN); HttpURLConnection urlcon = (HttpURLConnection) url.openConnection(); urlcon.connect(); //获取连接 if (200 == urlcon.getResponseCode()) { InputStream is = urlcon.getInputStream(); BufferedReader buffer = new BufferedReader(new InputStreamReader(is)); StringBuffer bs = new StringBuffer(); String l = null; while ((l = buffer.readLine()) != null) { bs.append(l).append("/n"); } //System.out.println(bs.toString()); long t = System.currentTimeMillis() - beginTime; data.add(t); //System.out.println("总共执行时间为:" + t + "毫秒"); } else { System.out.println("执行失败code=" + urlcon.getResponseCode()); } } catch (IOException e) { e.printStackTrace(); } } cdAnswer.countDown(); System.out.println("线程" + Thread.currentThread().getName() + "结束"); }); } cdOrder.countDown(); try { cdAnswer.await(); } catch (InterruptedException e) { e.printStackTrace(); } service.shutdown(); System.out.println("总共执行成功次数: " + data.size()); return data; }}
执行结果:
总共执行成功次数: 1000
avg: 38.039
95%: 40
划线
评论
复制
发布于: 2020 年 07 月 19 日 阅读数: 37
牛牛
关注
还未添加个人签名 2018.02.27 加入
还未添加个人简介
评论