第七周作业

用户头像
胡江涛
关注
发布于: 2020 年 07 月 18 日
第七周作业
  1. 性能压测的时候,随着并发压力的增加,系统响应时间吞吐量如何变化,为什么?

随着并发的增加,系统响应时间如下:

1.1 在日常运行期间,也就是并发用户数小于30之前,随着并发用户数的增加,响应时间会缓慢的略微上升、基本持平。因为,在达到系统最佳运行点b点之前,系统能够轻松应对30个并发用户数,并且提供有效快速的响应,系统服务器的内存使用率,CPU使用以及磁盘与网络I/O等都处在最优值。

1.2 当并发用户数大于30且小于100时,随着并发用户数的增加,系统响应时间有一个稍微明显的小幅上升,这个期间,系统处理相关高峰访问时间段,能够应付并发访问,不过响应时间会略有损耗。因为,在此期间,系统服务器的内存使用率,CPU使用以及磁盘与网络I/O等已经达到最优值,处理能力已经超过最佳状态。

1.3 当并发用户数大于100后,随着并发用户数的增加,响应时间,会有一个快速明显的上升,当达到系统能够承受的最大并发数时,系统会有崩溃风险。因为,在此期间,系统各项指标已经超过最佳值,更多的并发数,会导致响应堵塞。



随着并发的增加,吞吐量如下:

1.4 并发用户数在小于30之前,随着并发数的增加,吞吐量会有一个明显的快速上升趋势。

因为,在此期间,系统内存对象,线程数,CPU使用,磁盘和网络I/O等指标,都处在最优值之下,越多的并发数,会导致更大的吞吐量。

1.5 在并发数大于30并小于100前,随着并发数的增加,吞吐量也会有所上升,但效果不明显。因为,在此期间,系统内存对象,线程数,CPU使用,磁盘和网络I/O等指标,已经达到最优,更多的并发用户数,会导致响应速度的损耗,所以,吞吐量增加不那么明显。

1.6 当并发数超过100后,随着并发数的增加,吞吐量会慢慢的减少,然后快速的下滑。

因为,随着并发量的增加,系统性能会损耗,响应时间会增加,导致单位时间内,处理量下滑,更多的并发数,甚至会堵塞请求。



Note: 上图的并发数,仅供参考,不是实际情况。



  1. 用你熟悉的编程语言写一个Web性能压测工具。

输入参数:URL, 请求总次数并发数

输出参数:平均响应时间95%响应时间

用这个测试工具以10并发,100次请求压测www.baidu.com

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace PerformanceTest
{
class Program
{
static List<long> ResponseTimeList = new List<long>();//响应时间列表
public static string ReqURL = "";//请求URL
public static int ReqTotalNumer = 0;//请求总次数
public static int ReqConcurrentNumer = 0;//并发数
public static object ob1 = new object();
static void Main(string[] args)
{
Console.WriteLine("************开始测试Web性能************");
Console.WriteLine();
Console.WriteLine("请输入请求URL:");
ReqURL = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("请输入并发用户数(数字):");
string strReqConcurrentNumer = Console.ReadLine();
int.TryParse(strReqConcurrentNumer, out ReqConcurrentNumer);
Console.WriteLine();
Console.WriteLine("请输入请求总次数(数字):");
string strReqTotalNumer = Console.ReadLine();
int.TryParse(strReqTotalNumer, out ReqTotalNumer);
Console.WriteLine();
PerformanceMethond();//执行测试
Console.WriteLine("************测试中*********************");
Console.WriteLine();
Thread.Sleep(5000);//等待数据写入
Console.WriteLine("响应时间总条数:" + ResponseTimeList.Count);
//对结果排序
ResponseTimeList.Sort((x, y) => x.CompareTo(y));
#region 平均响应时间
long AverageTime = 0;
long TotalTime = 0;
foreach (long item in ResponseTimeList)
{
TotalTime += item;
// Console.WriteLine("响应时间为:" + item + "ms");
}
AverageTime = TotalTime / ReqTotalNumer;
Console.WriteLine("平均响应时间:" + AverageTime + "ms");
#endregion
#region 95%响应时间
long Per95Time = 0; //95%响应时间; 100个请求时,按响应时间倒序排列,取第95个响应时间值;1000个请求时,按响应时间倒序排列,取第950-959个响应时间值的平均数
int Min95 = (Int32)Math.Floor((double)ReqTotalNumer * 0.95);
int Max95 = (Int32)Math.Ceiling((double)ReqTotalNumer * 0.96);
long TotalTime95 = 0;//95%响应时间的总时间
int Count95 = 0;//95%响应时间的总条数
for (int i = Min95; i < Max95; i++)
{
TotalTime95 += ResponseTimeList[i];
Count95++;
}
Per95Time =(long)(TotalTime95 / Count95);
Console.WriteLine("95%响应时间:" + Per95Time + "ms");
#endregion
Console.ReadKey();
}
/// <summary>
/// 性能测试方法
/// 并发数ReqConcurrentNumer
/// 总请求次数ReqTotalNumer
/// </summary>
public static void PerformanceMethond()
{
//并发数10 ,进行请求
List<string> ConcurrentList = new List<string>();
for (int i = 0; i < ReqConcurrentNumer; i++)
{
ConcurrentList.Add("Request" + i);
}
Parallel.ForEach<String>(ConcurrentList, (item) =>
{
//Console.WriteLine(item);
RequestMethodAsync(ReqURL);
});
}
/// <summary>
/// 单次请求的方法
/// </summary>
/// <returns></returns>
//public static async void RequestMethodAsync(object URL)
public static void RequestMethodAsync(string URL)
{
int PerNumber = ReqTotalNumer / ReqConcurrentNumer;
for (int i = 0; i < PerNumber; i++)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
HttpClient client = new HttpClient();
//await client.GetStringAsync(URL.ToString());
client.GetStringAsync(URL);
stopwatch.Stop();
//防止锁住,添加数据失败
lock (ob1)
{
ResponseTimeList.Add(stopwatch.ElapsedMilliseconds);
}
//Console.WriteLine("当前线程ID" + Thread.CurrentThread.ManagedThreadId + ",响应时间为:" + stopwatch.ElapsedMilliseconds + "ms");
}
}
}
}





用户头像

胡江涛

关注

放肆才叫青春 2019.05.11 加入

IT软件工程师,一枚

评论

发布
暂无评论
第七周作业