压测笔记一、使用Jemeter对.NET6 WebApi的HelloWorld程序做并发压力测试

发布时间 2023-10-10 15:26:07作者: 古兆洋

转自:https://www.cnblogs.com/fuhua/p/16696237.html

使用Jemeter对.NET6 WebApi 并发压力测试

前言

现在我需要对一个.NET6 WebApi HelloWord程序进行并发性能测试

WebApi运行在局域网IP为192.168.1.163的机器上

Jmeter运行在局域网IP为192.168.1.90的机器上

说明:并发压测不可以将Jmeter和Webapi项目放在同一台机器上,因为两者同时都会消耗CPU和内存,会导致测试结果不准确。

机器配置:I5-10500 16G内存

 新建控制器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程序做了很多编译优化操作,比如函数内联等等会提高很多性能