写点什么

架构师训练营 - 命题作业 第 7 周

用户头像
铁血杰克
关注
发布于: 2020 年 07 月 22 日

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

响应时间在最佳运行区间略有上升;在负载测试区间逐渐上升;在压力测试区间迅速上升直至崩溃点。

吞吐量在最佳运行区间迅速上升;在负载测试区间缓慢上升;在压力测试区间下降直至崩溃点。

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

package test;
import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;
public class RequestThread implements Runnable { private static final Logger LOG = LoggerFactory.getLogger(RequestThread.class); private CountDownLatch countDownLatch; private String requestUrl; private ConcurrentLinkedQueue<Long> queue;
public RequestThread(String requestUrl, CountDownLatch countDownLatch, ConcurrentLinkedQueue<Long> queue) { this.requestUrl = requestUrl; this.countDownLatch = countDownLatch; this.queue = queue; }
public void run() { try { long startTime = System.currentTimeMillis(); boolean isSuccess = HttpClientUtil.get(requestUrl, null); if (!isSuccess) { LOG.error("response error.....threadName:" + Thread.currentThread().getName()); } long endTime = System.currentTimeMillis(); queue.add(endTime-startTime); countDownLatch.countDown(); } catch (Exception e) { LOG.error("requset error.....threadName:" + Thread.currentThread().getName()); }
}
}
复制代码


package test;
import java.io.IOException;import java.util.Arrays;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;
public class StressTest { private Integer threadCount = 0; private String requestUrl = null; private Integer requestCount = 0; private ExecutorService ThreadPool = null; private ConcurrentLinkedQueue<Long> queue = null; public static void main(String[] args) throws Exception { System.out.println("start execute....."); StressTest st = new StressTest(); st.init(10,"http://www.baidu.com",100); st.exec(); st.printResult(); }
public void init(int threadCount, String requestUrl, int requestCount) throws IOException { this.threadCount = threadCount; this.requestCount = requestCount; this.requestUrl = requestUrl; ThreadPool = Executors.newFixedThreadPool(this.threadCount); queue = new ConcurrentLinkedQueue<Long> (); }
public void exec() throws InterruptedException { CountDownLatch requestCountDown = new CountDownLatch(requestCount); for (int i = 0; i < requestCount; i++) { RequestThread requestThread = new RequestThread(requestUrl, requestCountDown, queue); ThreadPool.execute(requestThread); } requestCountDown.await(); } public void printResult() { int size = queue.size(); Long[] times = new Long[size]; queue.toArray(times); Arrays.parallelSort(times); long time100 = 0; int size95 = (int)(times.length*0.95); long time95 = 0; for (int i = 0; i < times.length; i++) { if(i<size95) time95 += times[i]; time100 += times[i]; } System.out.println("平均响应时间(毫秒):"+ time100/size); System.out.println("95% 响应时间(毫秒):"+ time95/size95); }
}
复制代码


start execute.....平均响应时间:44895% 响应时间:312
复制代码


发布于: 2020 年 07 月 22 日阅读数: 35
用户头像

铁血杰克

关注

还未添加个人签名 2017.12.18 加入

还未添加个人简介

评论 (3 条评论)

发布
用户头像
平均时间大于95分值,是不是有一些问题
2020 年 07 月 25 日 17:08
回复
95的计算方式应该是从小到大排序,取比例在95%的那个数值
2020 年 07 月 25 日 17:10
回复
用户头像
请加“极客大学架构师训练营”标签,便于分类
2020 年 07 月 22 日 18:22
回复
没有更多了
架构师训练营 - 命题作业 第 7 周