「架构师训练营」作业:第 7 周
发布于: 2020 年 07 月 19 日
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
在并发数量增加的过程中,一开始 TPS 是随着并发数增加而增加的,但是响应时间会处在较低的状态,也就是第1条虚线的位置。
接着响应时间开始有些增加,达到最大TPS,第2条虚线的位置。
这是继续增加并发数量,响应时间会接着增加,但是 TPS 会下降(这里不是必然的,有些系统会保持稳定的TPS)
最后,响应时间过长,达到了超时的状态。
用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:
平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
语言:C#
IDE:Visual Studio 2019
Sdk:.net core 3.1
public class StressTesting{ private IRestClient _RestClient; private ConcurrentQueue<long> _ResponseTime; /// <summary> /// 并发数 /// </summary> private int _concurrentNumber; /// <summary> /// 请求数 /// </summary> private int _requestQuantity; private string _url; public StressTesting(string url,int concurrentNumber,int requestQuantity) { _url = url; _concurrentNumber = concurrentNumber; _requestQuantity = requestQuantity; _RestClient = new RestClient(); } /// <summary> /// 并发测试 /// </summary> public void DoTest() { _ResponseTime = new ConcurrentQueue<long>(); var parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = _concurrentNumber }; Parallel.For(0, _requestQuantity, parallelOptions, (i) => { DoRequest(); }); ShowResult(); } /// <summary> /// 一次请求 /// </summary> private void DoRequest() { var stopwatch = new Stopwatch(); var request = new RestRequest(_url, Method.GET); stopwatch.Start(); _RestClient.Execute(request); stopwatch.Stop(); _ResponseTime.Enqueue(stopwatch.ElapsedMilliseconds); } /// <summary> /// 展示结果 /// </summary> private void ShowResult() { double avgTime = _ResponseTime.Average(); double avg95Time = Calculate95Avg(); Console.WriteLine(_url); Console.WriteLine("并发:{0}",_concurrentNumber); Console.WriteLine("请求次数:{0}",_requestQuantity); Console.WriteLine("结果:"); Console.WriteLine("平均响应时间:{0}", avgTime); Console.WriteLine("95%响应时间:{0}", avg95Time); } /// <summary> /// 计算 95% 响应时间 /// </summary> /// <returns></returns> private double Calculate95Avg() { double result = 0; long[] values = _ResponseTime.ToArray(); double stdDev = 0; double avg = values.Average(); double sum = values.Sum(d => Math.Pow(d - avg, 2)); stdDev = Math.Sqrt(sum / values.Count()); result = avg + (-stdDev) * 1.96 / Math.Sqrt(values.Count()); return result; }}
测试:
class Program{ static void Main(string[] args) { try { var test = new StressTesting("https://www.baidu.com/",10,100); test.DoTest(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("---------------- End ---------------------"); Console.ReadLine(); }}
划线
评论
复制
发布于: 2020 年 07 月 19 日 阅读数: 104
Amy
关注
还未添加个人签名 2018.06.10 加入
还未添加个人简介
评论