「架构师训练营」作业:第 7 周

用户头像
Amy
关注
发布于: 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();
}
}





用户头像

Amy

关注

还未添加个人签名 2018.06.10 加入

还未添加个人简介

评论

发布
暂无评论
「架构师训练营」作业:第 7 周