1.性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
稳定性测试
被测试系统在特定硬件、软件、网络环境条件下,给系统加载一定业务压
力,使系统运行一段较长时间,以此检测系统是否稳定。在生产环境,请求压力是不均
匀的,呈波浪特性,因此为了更好地模拟生产环境,稳定性测试也应不均匀地对系统施
加压力。
系统吞吐量变化
系统响应时间变化
在 a 到 b 的时间段,系统还没有达到预期的并发压力值,所以这个期间的响应时间基本没有变化,吞吐量处于一个直线上身的区间,这个区间是系统的最佳运行区间,这里可以知道系统的最佳运行点;
在 b 到 c 的时间段,这个时候系统已经有了一定的压力,并且某些系统资源出现的瓶颈,所以会导致这个区间的响应时间有了一定程度的增加,而吞吐量只有很小程度的增加,这一过程会使得系统的压力越来越大,但是还是系统的安全运行区间,这里可以知道系统的最大负载点;
在 c 到 d 的时间段,这个时候系统已经进入了系统最大的负载点,继续增大并发压力,会使响应时间大幅度增加,吞吐量反而会降低,这主要是应为系统资源的耗尽导致的,这一时间段最后会以系统崩溃结束,这里可以知道系统崩溃点;
2.用你熟悉的编程语言写一个 Web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95%响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
/**
* 类说明:用你熟悉的编程语言写一个Web性能压测工具,
* 输入参数:URL,请求总次数,并发数。
* 输出参数:平均响应时间,95%响应时间。
* 用这个测试工具以10并发、100次请求压测www.baidu.com。
*/
public class PerformanceTesting {
private static String urlStr;
private static long[] array;
private static List<Future> list;
private static int queryCount;
private static int concurrentCount;
private static CyclicBarrier cyclicBarrier;
private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);
private static ExecutorService executor = new ThreadPoolExecutor(20,20,60, TimeUnit.SECONDS, queue);
public PerformanceTesting(String url, int queryNumber,int concurrentNumber){
urlStr = url;
queryCount = queryNumber;
concurrentCount = concurrentNumber;
array = new long[queryCount*concurrentNumber];
list = new ArrayList<>(queryCount*concurrentNumber);
cyclicBarrier = new CyclicBarrier(concurrentCount);
}
public void test() throws ExecutionException, InterruptedException {
for (int i = 0; i < queryCount; i++) {
for (int j = 0; j < concurrentCount; j++) {
Callable<Long> callable = new Callable<Long>() {
@Override
public Long call() throws Exception {
cyclicBarrier.await();
long begin = System.currentTimeMillis();
URL url = new URL(urlStr);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
String result = "";
try (BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));) {
String line;
while ((line = in.readLine()) != null) {
result += line;
}
}
long useTime = System.currentTimeMillis() - begin;
return useTime;
}
};
Future future = executor.submit(callable);
list.add(future);
}
}
long allUseTime = 0;
for (int i = 0; i < concurrentCount; i++) {
array[i] = (Long)list.get(i).get();
allUseTime += array[i];
}
Arrays.sort(array);
int index = (int) (queryCount * concurrentCount * 0.95);
System.out.println("==================================");
System.out.println("平均响应时间:" + allUseTime/(queryCount * concurrentCount) + " millis");
System.out.println("95%响应时间:" + array[index] + " millis");
System.out.println("==================================");
executor.shutdown();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
PerformanceTesting test = new PerformanceTesting("http://www.baidu.com", 100, 10);
test.test();
}
}
复制代码
评论