第 7 周作业

用户头像
Rocky·Chen
关注
发布于: 2020 年 12 月 06 日

一、作业说明

作业一(至少完成一项):

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

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



二、作业实现

  1. 性能压测时,随着并发数增加,理想情况下:

响应时间:

第1阶段:响应时间随着并发数增加呈现稳定响应时长

第2阶段:响应时间随着并发数增加响应时长变大,设置服务崩溃

吞吐量:

第1阶段:吞吐量随着并发数增加吞吐量呈现线性增长

第2阶段:吞吐量随着并发数增加吞吐量呈现增长,但升率减小

第3阶段:吞吐量随着并发数增加吞吐量呈现下降,下降甚至服务崩溃



总结:出现如上所述情况,因宿主机资源有限,第1阶段随着并发数增加,线程所需资源宿主机基本满足,响应时长变化不大,吞吐量上升明显。随着并发数继续增加,进入第2阶段,线程频繁在用户态、内核态切换,IO阻塞,内存空间等限制,响应时长、吞吐量变化明显,甚至服务崩溃。生产环境随着业务当面临用户数或者请求数增加一般通过横向、纵向扩容满足业务需求。



2.性能压测工具

package online.chenkai.demon;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.ifugle.rap.dsb.xxzx.xxts.model.bo.rate.MessageWrapperBO;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Call;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* 性能压测
*
* @author chenkai 2020-12-06 15:21:00
* @version 1.0.0
*/
@Slf4j
public class PressureTest {
/**
* 网络连接
*/
private static OkHttpClient HTTP_POOL;
/**
* 线程池
*/
private static ForkJoinPool PRESSURE_THREAD_POOL;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请求地址: ");
String url = input.nextLine();
System.out.println("压测次数: ");
String requestCount = input.nextLine();
System.out.println("并发数: ");
String concurrentCount = input.nextLine();
int corePoolSize = Integer.parseInt(concurrentCount);
// 流量压测线程池
PRESSURE_THREAD_POOL = new ForkJoinPool(corePoolSize);
// 连接池
ConnectionPool connectionPool = new ConnectionPool(corePoolSize, 5, TimeUnit.MINUTES);
HTTP_POOL = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.readTimeout(120, TimeUnit.SECONDS)
.connectionPool(connectionPool)
.retryOnConnectionFailure(true)
.build();
// 流量构建
int counter = Integer.parseInt(requestCount);
List<Integer> requestNoList = new ArrayList<>(counter);
for (int i = 1; i <= counter; i++) {
requestNoList.add(i);
}
List<CompletableFuture<Long>> collectFuture = requestNoList.stream()
.map(requestNo -> CompletableFuture.supplyAsync(() -> execute(url, requestNo), PRESSURE_THREAD_POOL))
.collect(Collectors.toList());
List<Long> returnTimeList = collectFuture.stream().map(CompletableFuture::join).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(returnTimeList)) {
// 平均时长计算
long averageReturnTime =
returnTimeList.stream().mapToLong(value -> value).sum() / CollectionUtils.size(returnTimeList);
log.debug("平均响应时长:{}毫秒", averageReturnTime);
}
// 关闭线程池
PRESSURE_THREAD_POOL.shutdown();
}
/**
* 目标地址请求
*
* @param url 请求地址
* @param traceId 请求编号
*
* @return long 耗时
*/
private static long execute(String url, int traceId) {
long startTime = System.currentTimeMillis();
final Request request = new Request.Builder().url(url).build();
final Call call = HTTP_POOL.newCall(request);
try {
call.execute();
} catch (IOException e) {
}
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
log.debug("请求地址:{},请求编号:{},响应时长:{}毫秒", url, traceId, executeTime);
return executeTime;
}
}
执行结果:
请求地址:
https://www.baidu.com
压测次数:
100
并发数:
10
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:9,响应时长:260毫秒
2020-12-06 15:27:43,672 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:2,响应时长:262毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:7,响应时长:261毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:5,响应时长:262毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:1,响应时长:262毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:8,响应时长:261毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:6,响应时长:262毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:3,响应时长:262毫秒
2020-12-06 15:27:43,671 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:10,响应时长:260毫秒
2020-12-06 15:27:43,725 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:17,响应时长:51毫秒
2020-12-06 15:27:43,726 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:12,响应时长:53毫秒
2020-12-06 15:27:43,727 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:19,响应时长:53毫秒
2020-12-06 15:27:43,729 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:13,响应时长:56毫秒
2020-12-06 15:27:43,730 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:15,响应时长:57毫秒
2020-12-06 15:27:43,732 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:11,响应时长:58毫秒
2020-12-06 15:27:43,732 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:18,响应时长:58毫秒
2020-12-06 15:27:43,732 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:14,响应时长:59毫秒
2020-12-06 15:27:43,737 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:16,响应时长:64毫秒
2020-12-06 15:27:43,770 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:27,响应时长:38毫秒
2020-12-06 15:27:43,773 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:28,响应时长:36毫秒
2020-12-06 15:27:43,779 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:20,响应时长:54毫秒
2020-12-06 15:27:43,785 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:21,响应时长:59毫秒
2020-12-06 15:27:43,786 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:25,响应时长:54毫秒
2020-12-06 15:27:43,786 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:23,响应时长:57毫秒
2020-12-06 15:27:43,791 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:26,响应时长:59毫秒
2020-12-06 15:27:43,792 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:24,响应时长:61毫秒
2020-12-06 15:27:43,796 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:22,响应时长:69毫秒
2020-12-06 15:27:43,812 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:29,响应时长:41毫秒
2020-12-06 15:27:43,831 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:34,响应时长:45毫秒
2020-12-06 15:27:43,833 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:30,响应时长:60毫秒
2020-12-06 15:27:43,839 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:31,响应时长:60毫秒
2020-12-06 15:27:43,841 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:37,响应时长:45毫秒
2020-12-06 15:27:43,844 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:35,响应时长:53毫秒
2020-12-06 15:27:43,846 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:33,响应时长:60毫秒
2020-12-06 15:27:43,850 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:36,响应时长:58毫秒
2020-12-06 15:27:43,854 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:32,响应时长:69毫秒
2020-12-06 15:27:43,867 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:4,响应时长:459毫秒
2020-12-06 15:27:43,871 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:38,响应时长:59毫秒
2020-12-06 15:27:43,887 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:39,响应时长:56毫秒
2020-12-06 15:27:43,888 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:40,响应时长:55毫秒
2020-12-06 15:27:43,893 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:41,响应时长:54毫秒
2020-12-06 15:27:43,901 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:42,响应时长:60毫秒
2020-12-06 15:27:43,903 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:43,响应时长:58毫秒
2020-12-06 15:27:43,905 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:44,响应时长:59毫秒
2020-12-06 15:27:43,907 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:45,响应时长:57毫秒
2020-12-06 15:27:43,908 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:46,响应时长:54毫秒
2020-12-06 15:27:43,925 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:47,响应时长:58毫秒
2020-12-06 15:27:43,937 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:48,响应时长:66毫秒
2020-12-06 15:27:43,944 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:49,响应时长:57毫秒
2020-12-06 15:27:43,948 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:50,响应时长:60毫秒
2020-12-06 15:27:43,953 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:51,响应时长:60毫秒
2020-12-06 15:27:43,957 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:55,响应时长:49毫秒
2020-12-06 15:27:43,960 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:52,响应时长:59毫秒
2020-12-06 15:27:43,964 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:53,响应时长:61毫秒
2020-12-06 15:27:43,970 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:56,响应时长:62毫秒
2020-12-06 15:27:43,977 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:57,响应时长:51毫秒
2020-12-06 15:27:43,999 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:60,响应时长:51毫秒
2020-12-06 15:27:44,000 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:59,响应时长:56毫秒
2020-12-06 15:27:44,004 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:58,响应时长:65毫秒
2020-12-06 15:27:44,007 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:61,响应时长:53毫秒
2020-12-06 15:27:44,019 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:63,响应时长:59毫秒
2020-12-06 15:27:44,019 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:64,响应时长:55毫秒
2020-12-06 15:27:44,023 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:54,响应时长:118毫秒
2020-12-06 15:27:44,025 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:62,响应时长:68毫秒
2020-12-06 15:27:44,031 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:66,响应时长:54毫秒
2020-12-06 15:27:44,042 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:65,响应时长:71毫秒
2020-12-06 15:27:44,056 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:67,响应时长:57毫秒
2020-12-06 15:27:44,057 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:68,响应时长:57毫秒
2020-12-06 15:27:44,066 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:70,响应时长:58毫秒
2020-12-06 15:27:44,070 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:69,响应时长:66毫秒
2020-12-06 15:27:44,079 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:72,响应时长:59毫秒
2020-12-06 15:27:44,082 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:73,响应时长:59毫秒
2020-12-06 15:27:44,083 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:71,响应时长:64毫秒
2020-12-06 15:27:44,084 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:74,响应时长:59毫秒
2020-12-06 15:27:44,092 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:75,响应时长:61毫秒
2020-12-06 15:27:44,098 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:76,响应时长:56毫秒
2020-12-06 15:27:44,106 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:77,响应时长:50毫秒
2020-12-06 15:27:44,117 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:78,响应时长:60毫秒
2020-12-06 15:27:44,126 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:79,响应时长:60毫秒
2020-12-06 15:27:44,132 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:81,响应时长:53毫秒
2020-12-06 15:27:44,136 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:80,响应时长:66毫秒
2020-12-06 15:27:44,142 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:82,响应时长:60毫秒
2020-12-06 15:27:44,148 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:86,响应时长:50毫秒
2020-12-06 15:27:44,151 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:84,响应时长:67毫秒
2020-12-06 15:27:44,151 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:83,响应时长:68毫秒
2020-12-06 15:27:44,153 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:85,响应时长:60毫秒
2020-12-06 15:27:44,169 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:87,响应时长:63毫秒
2020-12-06 15:27:44,170 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:88,响应时长:53毫秒
2020-12-06 15:27:44,175 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:89,响应时长:49毫秒
2020-12-06 15:27:44,183 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:91,响应时长:47毫秒
2020-12-06 15:27:44,195 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:90,响应时长:63毫秒
2020-12-06 15:27:44,198 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:92,响应时长:56毫秒
2020-12-06 15:27:44,204 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:96,响应时长:50毫秒
2020-12-06 15:27:44,209 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:93,响应时长:61毫秒
2020-12-06 15:27:44,212 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:95,响应时长:61毫秒
2020-12-06 15:27:44,214 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:94,响应时长:63毫秒
2020-12-06 15:27:44,217 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:99,响应时长:42毫秒
2020-12-06 15:27:44,232 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:97,响应时长:62毫秒
2020-12-06 15:27:44,233 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:98,响应时长:62毫秒
2020-12-06 15:27:44,234 <DEBUG> online.chenkai.demon.PressureTest - 请求地址:https://www.baidu.com,请求编号:100,响应时长:51毫秒
2020-12-06 15:27:44,242 <DEBUG> online.chenkai.demon.PressureTest - 平均响应时长:80毫秒



用户头像

Rocky·Chen

关注

还未添加个人签名 2018.03.03 加入

还未添加个人简介

评论

发布
暂无评论
第7周作业