week7. 课后作业

用户头像
个人练习生niki
关注
发布于: 2020 年 07 月 19 日



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

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



响应时间:指应用系统从发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直观的反映了系统的快慢。

吞吐量=(1000/响应时间ms) * 并发数。

并发数:系统能够同时处理请求的数目,反映了系统的负载特性。

吞吐量:单位时间内系统处理的请求的数量,体现系统的处理能力。TPS(每秒事务数)、QPS(每秒查询数)也是吞吐量的一个指标。



  • 随着并发压力的增加,系统响应时间变化



在最佳运行区间,随着并发数的增加,系统的CPU、内存、带宽都能分配合理,响应时间基本不变。到系统最大负载点之前,系统的CPU、内存、带宽等方面的竞争增大,处理速度变慢,响应时间缓慢增长。过了系统最大负载点,并发数过高,导致系统的CPU、内存、带宽等方面的竞争急剧增大,请求消耗系统资源到了极限,请求都在抢占资源,无法被处理,等待时间增长,响应时间急剧增大。过了系统崩溃点继续增大并发数,系统崩溃,系统无法响应。



  • 随着并发压力的增加,吞吐量变化



在性能测试阶段,随着并发数的增加,TPS迅速增加,系统的CPU、内存、带宽都能分配合理,吞吐量不断上升。到了负载阶段,系统的CPU、内存、带宽等方面的竞争增大,处理速度变慢,TPS增速减缓,吞吐量增速变缓。到了压力测试阶段,并发数过高,导致系统的CPU、内存、带宽等方面的竞争急剧增大,请求消耗系统资源到了极限,请求都在抢占资源,无法被处理,等待时间增长,TPS开始下降,吞吐量开始减少。过了压力测试阶段继续增大并发数,系统崩溃,无法提供服务,吞吐量降为0。

系统在b点的左边运行需要更多服务器资源,更安全,在右侧会更容易崩溃,更节省服务器资源。需要和服务器资源之间取得平衡。



package com.demo.test;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
/**
* @author niki-lauda
* @create 2020-07-19 18:03
*/
public class HttpUtils {
public static void doGet(String url) {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.setSocketTimeout(15000)
.build();
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(requestConfig);
CloseableHttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
// if(entity != null) {
// System.out.println("响应内容长度=" + entity.getContentLength());
// System.out.println("响应内容=" + EntityUtils.toString(entity, "UTF-8"));
// }
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(httpResponse != null) {
httpResponse.close();
}
if(httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}



package com.demo.test;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author niki-lauda
* @create 2020-07-19 16:16
*/
public class RequestTimeTest {
private static final int KEEP_ALIVE_TIME = 3;
private CopyOnWriteArrayList<Long> executeTimeList;
private CountDownLatch countDownLatch;
public RequestTimeTest(CopyOnWriteArrayList<Long> executeTimeList, CountDownLatch countDownLatch) {
this.executeTimeList = executeTimeList;
this.countDownLatch = countDownLatch;
}
public void concurrentTest(String url, int totalTimes, int concurrentNum) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(concurrentNum, concurrentNum, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
threadPoolExecutor.allowCoreThreadTimeOut(true);
long start = System.currentTimeMillis();
for (int i = 0; i < totalTimes; i++) {
// int finalI = i;
threadPoolExecutor.execute(() -> {
HttpUtils.doGet(url);
executeTimeList.add(System.currentTimeMillis() - start);
// System.out.println(finalI + " done");
countDownLatch.countDown();
});
}
while(countDownLatch.getCount() != 0) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// System.out.println("executeTimeList=" + executeTimeList);
}
public double getAverageTime() {
double averageTime = 0;
for (Long executeTime : executeTimeList) {
averageTime += executeTime / executeTimeList.size();
}
return averageTime;
}
public double getResponseTime(int percent) {
return executeTimeList.get(executeTimeList.size() * percent / 100);
}
public static void main(String[] args) {
String url = "https://xie.infoq.cn/";
int totalTimes = 100;
RequestTimeTest timeTest = new RequestTimeTest(new CopyOnWriteArrayList<>(), new CountDownLatch(totalTimes));
timeTest.concurrentTest(url, totalTimes, 10);
System.out.println(String.format("平均响应时间=%.2fms", timeTest.getAverageTime()));
System.out.println(String.format("95%%响应时间=%.2fms", timeTest.getResponseTime(95)));
}
}



平均响应时间=1426.00ms
95%响应时间=2252.00ms



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

做一个真诚、坦诚的行人,追求自由。 2018.07.30 加入

还未添加个人简介

评论

发布
暂无评论
week7.课后作业