架构师训练营 - 命题作业 第 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.....
平均响应时间:448
95% 响应时间:312



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

铁血杰克

关注

还未添加个人签名 2017.12.18 加入

还未添加个人简介

评论 (2 条评论)

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