欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【nGrinder】性能压测平台记录文档(1)

【nGrinder】性能压测平台记录文档(1)

2024/10/26 23:44:42 来源:https://blog.csdn.net/gogoboi_jin/article/details/143225847  浏览:    关键词:【nGrinder】性能压测平台记录文档(1)

一、简介

nGrinder 是 NAVER(互联网公司NHN旗下的搜索引擎网站,相当于国内的百度)开源的性能测试工具,使用 Spring 框架开发,本次咱们使用的是2020年推出的 3.4.4 版本,在之后的版本都是改成了SpringBoot框架并使用的 gradle 构建的(没有使用,不确定稳定性),从 12年开始到现在已经经历了9年时间的迭代,目前国内很多大企业(电商,金融等行业)都开始使用该平台,不过因为国外跟国内行情不同,每个公司多少都会对源码重新修改并部署,平台也有很多对外开放 API 可以灵活做二次开发。

源代码下载地址 https://github.com/naver/ngrinder/releases。

二、部署

下载项目后后导入到ideal (JDK, Maven)中, 直接在 parent 项目(也就是最外层的 pom 路径)中构建项目(mvn clean package),会在controller 模块中生成 ngrinder.war 包,因为当前项目没有内置 servlet容器,所以需要外部的容器工具来启动,我们使用的是 tomcat(可以根据需求改成 undertow, jetty等容器启动)。

三、使用

1. 登陆页面

使用默认账号admin,进入后可以点击 用户管理添加和修改账户信息。

2. 创建项目

在标题栏上有一个 script 按钮,这个可以查看和创建当前登陆账户的脚本,不同账户之间的脚本是不共享的。

点击创建脚本

A. python 构建, 平台内部使用的 JythonScriptHandler 来处理脚本,里面实际依赖的是

<dependency>

        <groupId>org.python</groupId>

        <artifactId>jython-standalone</artifactId>

        <version>2.5.3</version>

</dependency>

这是一个 python 解释器,内部使用的是 exec(“python 脚本”) 和execfile("/hello.py") 直接在jvm里执行 python 代码,该程序运行速度相较正常的Java或者Python都要慢点, 不推荐使用。

B. groovy 构建, 内部使用的是 GroovyScriptHandler 处理脚本, 里面依赖的是

<dependency>

        <groupId>org.codehaus.groovy</groupId>

        <artifactId>groovy-all</artifactId>

        <version>2.2.1</version>

</dependency>

内部使用的是 eval(“Groovy 脚本”) 和 invodeFunction(groovy文件)、invodeMethod(groovy文件)来执行 groovy 代码, 创建后相当于创建了一个普通的java 工程,但是依赖包 还有自己写的相关类都在根路径下,测试过程中很容易产生找不到相关类,路径错误的问题。

C. maven 构建, 实际上还是调用的groovy的执行引擎,只不过里面使用这两个依赖包

<dependency>

        <groupId>org.apache.maven</groupId>

        <artifactId>maven-embedder</artifactId>

        <version>3.6.3</version>

</dependency>

<dependency>

        <groupId>org.apache.maven</groupId>

        <artifactId>maven-compat</artifactId>

        <version>3.6.3</version>

</dependency>

它们是一个代码形式的maven管理工具,我们所写的的压测脚本完全可以使用maven项目来构建,提高开发效率,也是生产过程中使用的构建方法。

创建maven项目 press-performance(提前已经创建好了),创建成功后会生成标准的 maven 目录结构项目

--lib (如果有些依赖没有在私服或者中央仓库里,maven 项目默认没有这个,它是平台单独给创建的)

--pom.xml (maven 的pom管理文件)

--src(源路径)

----main

------java(代码路径)

------resources(配置文件路径)

----test

------java(测试代码路径)

------resources(测试代码的配置文件路径)

3. 编写脚本

将之前创建的项目导入本地,把依赖都下载到本地(创建成功时,生成的pom里面已经填写了一些必须依赖的三方包)

当前 press-performance 项目最后形成的工程目录

java/

com/project/performance/ // 项目包路径

        callback/ // 回调接口

        client/ // 自定义的客户端

        param/ // 接口参数

        test/ // 压测脚本

        cmim/ // 压测 im 的测试脚本

        http/ // 压测 http 的测试脚本

        rtc/ // 压测 web rtc 的测试脚本

        signal/ // 压测信令的侧睡脚本

utils/ // 公共工具包

resources/

        properties/ // 存放 properties 配置文件

        stream/ // 存放流媒体文件

        logback.xml //项目日志配置文件

        spring-context.xml // spring配置文件

4. 常用注解

@RunWith(GrinderRunner) //全包路径org.junit.runner.RunWith。测试类上面需要注解的内容, 这个是指定运行环境,压测使用的是GrinderRunner运行,这个是固定写法。

@BeforeProcess // 全包路径net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess。创建进程时会触发,1个进程只会触发一次(比如创建4个进程,每个进程都是执行一下该方法),也就是测试开始的时候

@AfterProcess // 全包路径

net.grinder.scriptengine.groovy.junit.annotation.AfterProcess。进程运行结束时会触发,其他同

@BeforeProcess

@BeforeThread // 全包路径

net.grinder.scriptengine.groovy.junit.annotation.BeforeThread。每个线程初始化会调用一次,其他同

@AfterThread // 全包路径

net.grinder.scriptengine.groovy.junit.annotation.AfterThread。每个线程运行结束时会调用一次,其他同@BeforeProcess

@Before @Test @After// 全包路径org.junit。每个线程执行测试时的执行顺序是 Before -> Test -> After,然后执行次数是根据页面的配置,可以配置时间或者次数。实际压测的时候,会先创建指定的进程,然后在每个进程内在创建指定的线程,初始化完成后,就会进行压测

Before->Test->After 顺序操作, before 一般用来编写测试用例的初始化动作,test 编写测试动作,after 编写一轮测试完成后的销毁动作(包含复合@Test测试使用 @RunRate (100) 设定)

GTest 类,全类路径是 net.grinder.script.GTest, 它负责统计测试执行的记录(复合测试,需要定义多个GTest)

查看 PressChat 私聊压测脚本,实际演示

5. 添加代理

点击页面上的下载代理,把代理包下载到本地,然后传到代理机器上,启动run_agent.sh shell 脚本(使用admin账户下载的启动包是全部用户都可以使用的代理,使用其他账户下载的代理只能自己使用,不过可以修改配置文件__agent.conf 里面的 agent.region 改成=NONE 便可全部人使用代理)

6. 执行压测

1)点击标题栏上的 Performance Test,它可以创建和查看历史测试记录

2)点击 Create Test 创建压测

以上的信息都可以随便写,就是在压测结束后,会在记录保留这些信息

Agent max:1 指的是当前账户能最使用的最大代理数目,可以启动多个代理,(注意:真正压测使用的都是这个代理,而非启动ngrinder那个平台,平台只负责统计和存储、控制代理运行,真正负责压测的是那个代理)

Processes 要创建的进程数目,Threads 要创建的线程数目

比如当前用户的最大使用代理数为10,他可以设置使用5台代理,初始化5个进程,20个线程,nGrinder 控制台会启动5个代理,然后每个代理启动了5个进程(5个java程序),每个进程初始化了20个线程,最终模拟的虚拟用户数就是代理数5 * 进程数 5 * 线程数 20 == 500个虚拟用户数。Vuser per agent 是平台给计算出一个代理的总虚拟用户数,可以直接在 Vuser per agent 上编写需要虚拟的用户数,也可以直接自定义 processed 和 threads 自己计算需要的用户数。

点击下拉框选择要执行的脚本。Script Resources 是把当前项目的所有文件列举出来,不用管这个。

Target Host 这个是用来代替 Host 文件使用,比如我们想要告诉代理www.abc.com 域名就是 192.168.1.1 可以这么设置

点击添加后,所有当前执行的代理都会把 域名 www.abc.com 当成 192.168.1.1 地址进行访问。

执行测试设置,Duration 执行压测的时常,Run Count 执行测试的总次数。压测可以选择其中一个控制压测,比如Duration 设置5分钟,线上压测就会执行5分钟的压测,Run Count 设置10000次,线上压测就会执行10000次的压测,然后结束。

Sampling Interval 采样间隔,压测过程中间隔时间做一次统计,比如设置5S,压测结果的echart 图,就会显示每5秒内的访问数,错误数,平均响应时间等

Ignore Sample Count 忽略取样数目,就是统计的时候减少指定的数目来进行统计,默认值0

Parameter 测试参数,不是给请求接口添加参数,是给系统环境添加参数,比如脚本里 System.getProperties(“user.dir”) 可以获取到当前用户的home目录, 可以在这里填写只能为1〜50个字母和数字、下划线、逗号、圆点(.)或竖线(|)组成,禁止输入空格。而脚本可以通过System.getProperties(“param”) 获取这里面填写的值。

Enable Ramp-Up 根据时间控制进程和线程初始化数到指定值的,比如点击启用 Ramp-Up 后,下拉框选择 Process, 我们设定初始化1000个虚拟用户,其中进程20个,线程50个。Initial Count (初始数)选择2,Incremental Step(增量) 选择1,Initial Sleep Time (初始等待时间)填写 1000 ms,Interval(进程增长间隔) 填写2000ms,这样的结果就是线上压测时,就是先延迟 1000ms 然后马上初始化2个进程,然后延迟2000ms在初始化1个进程,然后延迟2000ms在初始化1个进程 ..... 知道总初始化进程数到指定的20。线程跟进程同理。

下面的图可以根据填写的规则直接展示数初始化的图。

Y轴显示的是虚拟用户总数,X轴是秒,当前功能如果不启用,运行压测时,平台会直接让代理初始化指定进程和线程数,不会进行根据时间规则控制数目增长。

四、启动测试

  1. 启动测试前,可以在目标服务器上添加监听器, 先点击 Download Monitor 下载监听器, 下载后是一个 tar 包,传到目标服务器上后,解压tar包,并启动 run_monitor.sh 脚本,__agent.conf 也是当前的配置文件,可以在启动前修改,一般情况不需要修改,保持默认就好。
  2. 然后点击 Add test target 添加 目标的服务器ip,比如

  

如果对方部署的是集群,可以添加多个

启动有两种,一种是马上启动压测,还有一种是设置一个时间点启动

点击运行后进入 Performance Test, 可以查看到自己刚刚启动的压测

当前按钮蓝色闪动表示正常打包到代理上,绿色闪动表示已经传输完成正在压测。停止闪动表示压测结束。

五、测试过程

进入到测试创建的页面,可以看到当前测试的实时数据,比如当前代理和目标服务器的资源信息(CPU,内存),已经测试的时间,错误数,成功数,平均TPS,平均事物耗时等

六、压测结束

搜索压测列表,点击之前压测的记录

Report 标签下都是当前压测的统计记录

Total Vusers 虚拟的用户总数

TPS 平均每秒事物总数

Peak TPS 当前测试过程中 TPS 中最高的数值

Mean Test Time 统计当前测试过程中所有事务的平均消耗时间

Executed Tests 统计当前测试过程中执行总次数

Successful Tests 统计当前测试过程中成功的次数

Errors 统计当前测试过程中失败的次数

Run time 当前测试过程中总压测时间

右边的 TPS 图是压测过程中的一个走势图

Logs 下是每个代理的执行日志,如果有3个代理执行,就有三个日志记录

点击Detailed Report 可以进入报告详情页面

可以看到 TPS、MTT、MTTFB、Vuser、Errors 压测过程的走势图

点击 TARGET HOSTS 下具体机器可以看到目标服务器的

CPU 走势信息

内存信息

下行流量信息(也就是接收到请求数据大小)

上行流量信息(向外界发送数据大小)

这些目标服务器的数据信息在压测过程中可以实时统计查看,压测结束后根据之前统计的数据汇总成一个走势图。

七、总结

nGrinder 文档少,目前国内论坛也只有一个(http://ngrinder.373.s1.nabble.com/ngrinder-user-cn-f114.html),很多使用中发现的问题可以从论坛中寻找,不过大部分是从源码中寻找逻辑,加以修改适配。随着3.5.0平台更新框架,导致了很多压测场景不稳定。下载很多都是p1 等非稳定版本,不过在最新版本中添加了gradle项目支持,可以编写gradle groovy 项目 。最新版本的 HttpClient 改成基于 apache 的 httpcomponents-core,传入的 headers 头信息和 params参数信息都是用 Map<String, String> 方式,修改http协议版本可使用 request.setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1) // or HttpVersionPolicy.FORCE_HTTP_2 等。待nGrinder 出现GA版本,随时准备切换。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com