第 7 周作业一

用户头像
ruettiger
关注
发布于: 2020 年 07 月 22 日

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

性能压测随着并发压力的增加,

系统响应时间会持续上升,也会分为几个阶段:系统稳定阶段、系统最大负载点、系统崩溃点。在系统崩溃点出现之后,系统响应时间无限增大。 系统的吞吐量:首先系统的吞吐量计算公式:吞吐量=(1000/响应时间ms)*并发数 可以看出吞吐量跟并发数和响应时间存在一定关系,在并发压力不断增加的情况下,当未达到压力测试的临界点的时候,吞吐量是增加的,当达到临界点时吞吐量下降。



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

package com.rudy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
/*
用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。
输出参数:平均响应时间,95% 响应时间。
用这个测试工具以 10 并发、100 次请求压测 www.baidu.com
*/
public class PerformancePressureTool implements Runnable {
private ArrayList<Long> longs = null;
private String urlStr; //请求Url
private int requestCount; //请求数
private int concurrentCount; //并发数
private int receiveCount; //到达数
private int needReciveCount; //需要到达数
public PerformancePressureTool(String urlStr, int requestCount, int concurrentCount, int needReciveCount) {
if (longs == null) {
longs = new ArrayList<>();
}
this.urlStr = urlStr;
this.requestCount = requestCount;
this.concurrentCount = concurrentCount;
this.needReciveCount = needReciveCount;
}
public void onCallback(long time) {
longs.add(time);
receiveCount++;
if (receiveCount == needReciveCount) {
long sum = 0;
for (int i = 0; i < longs.size() - 1; i++) {
sum += longs.get(i);
}
System.out.println("请求到达数:" + receiveCount + " 响应时间:" + sum / receiveCount);
}
}
//获取平均时间
public void avgResponTime() {
for (int i = 0; i < concurrentCount; i++) {
Thread thread = new Thread(this);
thread.start();
}
}
/**
* 获取Url响应时间,下载对应url的内容
*
* @return
*/
public void getResponTime() {
HttpURLConnection urlConnection = null;
InputStream openStream = null;
long start = System.currentTimeMillis();
long end = 0;
try {
URL url = new URL(urlStr);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
openStream = url.openStream();
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(openStream));
String tmp = null;
while ((tmp = reader.readLine()) != null) {
builder.append(tmp + "\n");
}
end = System.currentTimeMillis();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
try {
urlConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
if (openStream != null) {
try {
openStream.close();
} catch (IOException e) {
e.printStackTrace();
}
onCallback(end - start);
}
}
}
@Override
public void run() {
for (int i = 0; i < requestCount; i++) {
getResponTime();
}
}
public static void main(String[] args) {
PerformancePressureTool performancePressureTool = new PerformancePressureTool("http://www.baidu.com", 10, 10, 95);
performancePressureTool.avgResponTime();
}
}





用户头像

ruettiger

关注

还未添加个人签名 2018.05.30 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
请加“极客大学架构师训练营”标签,便于分类
2020 年 07 月 22 日 18:07
回复
没有更多了
第7周作业一