训练营第七周作业
发布于: 2020 年 12 月 04 日
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
公式:
有几个节点:系统最佳运行点-->B,系统最大负载点 -->L
T <= 系统达到系统最佳运行点: 系统响应时间几乎不变,吞吐量逐渐变大
系统最佳运行点<=T<=系统最大负载点: 响应时间缓慢变大,吞吐量缓慢降低
T >=系统最大负载点: 响应时间快速变大,吞吐量缓慢降低
用你熟悉的编程语言写一个 Web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
package com.test;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.apache.commons.cli.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;
/**
* @author liucheng.zhang
* @since 2020-12-04
**/
public class WebBenchmark {
public static void main(String[] args) {
OkHttpClient okHttpClient = new OkHttpClient();
Options options = new Options();
Option url = new Option("u", "url", true, "url");
url.setRequired(true);
options.addOption(url);
Option concurrent = new Option("c", "concurrent", true, "concurrent");
concurrent.setRequired(true);
options.addOption(concurrent);
Option total = new Option("t", "total", true, "total");
total.setRequired(true);
options.addOption(total);
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
int c = Integer.parseInt(cmd.getOptionValue("concurrent"));
int t = Integer.parseInt(cmd.getOptionValue("total"));
String u = cmd.getOptionValue("url");
Request request = new Request.Builder().url(u).build();
ExecutorService executorService = Executors.newFixedThreadPool(c);
List<Future<Long>> futures = new ArrayList<Future<Long>>();
for (int i = 0; i < t; i++) {
Future<Long> future = executorService.submit(() -> {
long start = System.currentTimeMillis();
okhttp3.Response response = okHttpClient.newCall(request).execute();
long r = System.currentTimeMillis() - start;
response.close();
return r;
});
futures.add(future);
}
List<Long> result = new ArrayList<>();
Long totalTime = 0L;
for (Future<Long> future : futures) {
try {
while (!future.isDone()) ;
final Long l = future.get();
totalTime += l;
result.add(l);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
Collections.sort(result);
System.out.println("avg:" + (totalTime / t) + "ms,95%:" + result.get((int) (0.95d * t) - 1)+"ms");
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("utility-name", options);
System.exit(1);
}
System.exit(1);
}
}
复制代码
输出:
avg:64ms,95%:483ms
复制代码
划线
评论
复制
发布于: 2020 年 12 月 04 日阅读数: 21
大脸猫
关注
还未添加个人签名 2018.04.27 加入
还未添加个人简介
评论