压测笔记一、使用Jemeter对.NET6 WebApi的HelloWorld程序做并发压力测试
使用Jemeter对.NET6 WebApi 并发压力测试
前言
现在我需要对一个.NET6 WebApi HelloWord程序进行并发性能测试
WebApi运行在局域网IP为192.168.1.163的机器上
Jmeter运行在局域网IP为192.168.1.90的机器上
说明:并发压测不可以将Jmeter和Webapi项目放在同一台机器上,因为两者同时都会消耗CPU和内存,会导致测试结果不准确。
机器配置:I5-10500 16G内存
新建.NET6 WebApi项目
新建控制器AttackController并写入下面代码
using Microsoft.AspNetCore.Mvc;
namespace Attack.Controllers
{
/// <summary>
/// 压力测试
/// </summary>
[ApiController]
[Route("[controller]")]
public class AttackController : ControllerBase
{
/// <summary>
/// 用于演示压力测试的接口
/// </summary>
/// <returns></returns>
[HttpGet(Name = "TestAttack")]
public string TestAttack()
{
return "HelloWorld";
}
}
}
F5运行并保证接口能正常请求
接下来配置局域网访问
到Debug目录下运行接口exe文件,使用局域网IP在swagger上测试并保证接口能正常请求
使用浏览器开发者工具对刚才的请求进行抓包
配置Jmeter(重点)
下载Jmeter
开源地址:https://github.com/apache/jmeter
下载地址:https://jmeter.apache.org/download_jmeter.cgi
Jmeter设置永久中文显示
修改Jmeter bin目录下的jmeter.properties文件,设置language=zh_CN
运行jmeterw.cmd添加一个线程组
添加Http请求取样器
填写箭头所指的参数
添加->监听器->查看结果树,查看结果树可以看到每次请求的报文
之后点击启动按钮就可以在结果树里看到每次请求的响应信息了
注意:上述的操作仅仅只是测试下我们的配置是否正确,以及接口是否能正常响应,接下来才是正确配置并发压测
首先点击清除全部按钮将之前的压测结果清除
添加->监听器->聚合报告,用于检测当前并发下的吞吐量等信息
添加->监听器->用表格查看结果,用于用表格的方式反馈结果
添加->定时器->Synchronizing Timer(同步定时器)
这个是重点,当不添加同步定时器时,每启动一个线程则会立即发起请求,最终会导致比如1000个线程实际总计请求了10秒钟,
这就不叫并发了。并发的意义在于同一时间内同时执行的请求。
而这个同步定时器就是用于给已经启动的线程上锁,直到所有线程都启动完成才会同时发起请求。
1000并发结果
3000并发结果
5000并发结果
总结:我们可以在聚合报告中看到,5000个线程并发平均响应时间是537毫秒,吞吐量为2510.0/sec表示每秒可以处理2510.0个请求性能还是非常强悍的。另外:其实上述的测试并不完全准确。
1.真实的压测需要使用控制台程序而不是这样可视化的GUI程序,因为GUI程序的界面渲染是很耗费时间的会影响压测结果
2.192.168.1.90这台机器上运行Jmeter开启5000个并发,CPU根本不足以开启这么多并发线程,会导致CPU使用率100%的情况,也会影响测试结果
3.正确的做法是Jmeter使用控制台做集群,每个Jmeter客户端都要根据当前硬件条件合理地设置线程数量
4.之前是对Debug版本程序做的压力测试,实际项目中应该对Release版本进行压测,Release版本对.NET程序做了很多编译优化操作,比如函数内联等等会提高很多性能