前言

Gatling

Gatling是一款功能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计。

开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP服务器的首选工具。由于核心引擎实际上是协议不可知的,因此完全可以实现对其他协议的支持。例如,Gatling目前还提供JMS支持。

代码自定义并且场景资源有效是Gatling的两个基础。并且拥有富有表现力的DSL,自我解释的场景,易于维护,可以保存在版本控制系统中的优点。

只要底层协议(如HTTP)可以以非阻塞方式实现,Gatling的体系结构就是异步的。这种架构允许我们将虚拟用户实现为消息而不是专用线程,这使得硬件要求不需要很苛刻。因此,运行数千个并发虚拟用户不是问题。

使用理由

  • 避免崩溃:Gatling可以帮助您预测缓慢的响应时间和奔溃。

  • 缩短产品上市时间:Gatling 在开发周期的早期检测到性能问题和错误

  • 增强用户体验:Gatling可以准确描述您最慢的用户体验

  • 提升您的业务:加特林可以防止您的业务成为自身成功的牺牲品

性能测试

性能测试是什么意思?

Web应用程序的性能测试包括:

  1. 模拟大量具有复杂行为的用户;

  2. 收集和汇总所有请求的响应时间;

  3. 创建报告分析数据;

编写测试场景,自动化测试

Gatling的类似代码的脚本使您可以轻松维护测试场景,并在持续交付管道中轻松实现自动化。

我们开发了自己的领域特定语言(DSL),以便让每个人都能轻松阅读您的场景。

分析并调查您的应用程序的瓶颈

Gatling是一个功能强大的工具:只需几台计算机,您就可以 在Web应用程序上模拟每秒数十万个请求,并获得高精度指标

在测试结束时,Gatling会自动生成详尽,动态丰富多彩的报告

平均值和平均数据是不够的:使用Gatling,您可以得到适当响应时间百分位数不要让最慢的用户落后!

安装

准备工作

Java版本

Gatling主要针对Oracle提供的JDK8软件包进行测试。Gatling需要JDK8(因此不支持JDK9 atm)。Gatling应该适用于任何JDK8更新,但我们建议您使用最新版本。

IPv4 vs IPv6

发现IPv6(默认情况下在Java上启用)有时会导致一些性能问题,因此启动脚本会使用以下选项禁用它:

  1. -Djava.net.preferIPv4Stack=true
  2. -Djava.net.preferIPv6Addresses=false

如果您确实需要优先选择IPv6,请编辑启动脚本。

操作系统调整

以下说明摘自伟大的Riak文档。 有关更多详细信息或OS X的说明,请参阅“ 打开文件限制” 和“ 内核和网络调整”部分。

在正常操作期间,Gatling会消耗大量的打开文件句柄。通常,操作系统会限制此数量,因此您可能必须在所选操作系统中调整一些选项,以便可以打开许多新套接字并实现高负载。

打开文件限制

大多数操作系统都可以使用该命令更改打开文件限制。例:ulimit -n

  1. $ ulimit -n 65536

但是,这只会更改当前shell会话的限制。在系统范围内,永久性地更改限制因系统而异。

为系统的所有用户永久设置软值和硬值以允许最多65536个打开文件; 编辑/etc/security/limits.conf并附加以下两行:

  1. * soft nofile 65535
  2. * hard nofile 65535

保存文件。启动新会话以使限制生效。您现在可以验证是否正确设置了限制。ulimit -a

对于Debian和Ubuntu,您应该启用PAM用户限制。为此,请添加:session required pam_limits.so

  • /etc/pam.d/common-session

  • /etc/pam.d/common-session-noninteractive 如果文件存在

  • /etc/pam.d/sshd 如果您通过SSH访问该计算机

另外,如果访问通过SSH的机器,一定要具有在UseLogin yes``/etc/ssh/sshd_config

要进行更多调整,您可能需要执行以下操作:

  1. # more ports for testing
  2. sudo sysctl -w net.ipv4.ip_local_port_range="1025 65535"

  3. # increase the maximum number of possible open file descriptors:
  4. echo 300000 | sudo tee /proc/sys/fs/nr_open
  5. echo 300000 | sudo tee /proc/sys/fs/file-max
内核和网络调优

考虑调整内核和网络,并在/etc/sysctl.conf中添加以下这些设置:

  1. net.ipv4.tcp_max_syn_backlog = 40000
  2. net.core.somaxconn = 40000
  3. net.core.wmem_default = 8388608
  4. net.core.rmem_default = 8388608
  5. net.ipv4.tcp_sack = 1
  6. net.ipv4.tcp_window_scaling = 1
  7. net.ipv4.tcp_fin_timeout = 15
  8. net.ipv4.tcp_keepalive_intvl = 30
  9. net.ipv4.tcp_tw_reuse = 1
  10. net.ipv4.tcp_moderate_rcvbuf = 1
  11. net.core.rmem_max = 134217728
  12. net.core.wmem_max = 134217728
  13. net.ipv4.tcp_mem = 134217728 134217728 134217728
  14. net.ipv4.tcp_rmem = 4096 277750 134217728
  15. net.ipv4.tcp_wmem = 4096 277750 134217728
  16. net.core.netdev_max_backlog = 300000

离线下载

您可以离线下载Gatling。然后,您只需要一个文本编辑器(Scala语法高亮)来编辑模拟,您就可以从命令行启动Gatling。

查看我们的下载页面以获取下载链接。

将下载的包解压缩到您选择的文件夹中。使用bin目录中的脚本启动Gatling和Recorder。

Windows用户:我们建议您不要将Gatling放在“ Programs”文件夹中,因为可能存在权限和路径问题。

要运行Gatling,您需要安装JDK。加特林至少需要JDK8。然后,我们建议您使用最新版本。

  • Gatling启动脚本和Gatling maven插件会在JAVA_HOMEenv var中设置它。

    与OSX一样,操作系统有自己的棘手方法来发现要运行的Java版本,因此最终可能会运行与您告诉您的版本不同的版本。如果您遇到奇怪的错误,并且您希望运行JDK8,则可能需要明确设置JAVA_HOMEjava -version``Unsupported major.minor version 51.0

使用构建工具

Maven

Gatling提供了一个名为gatling-maven-plugin的官方maven 插件。这个插件允许您编译Scala代码并启动Gatling模拟。

有了这个插件,Gatling可以在构建项目时启动,例如使用您最喜欢的CI解决方案。

Versions

查看Maven Central上的可用版本。

请注意,OSS用户未记录里程碑(M版本),仅针对专业版客户发布。

Setup

在你的pom.xml,添加:

  1. <dependencies>
  2. <dependency>
  3. <groupId>io.gatling.highcharts</groupId>
  4. <artifactId>gatling-charts-highcharts</artifactId>
  5. <version>MANUALLY_REPLACE_WITH_LATEST_VERSION</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </dependencies>

  9. <plugin>
  10. <groupId>io.gatling</groupId>
  11. <artifactId>gatling-maven-plugin</artifactId>
  12. <version>MANUALLY_REPLACE_WITH_LATEST_VERSION</version>
  13. </plugin>
演示样本

您可以在Gatling的Github组织中找到gatling-sbt-plugin-demo示例项目

您还可以使用gatling-highcharts-maven-archetype来引导项目。

Usage

您可以直接启动gatling-maven-plugin,其test目标是:

  1. mvn gatling:test

它默认绑定到integration-test阶段。

Configuration

下面的例子显示了默认值(所以不要指定你没有覆盖的选项!!!):

  1. <configuration>
  2. <simulationClass>foo.Bar</simulationClass> <!-- the name of the single Simulation class to run -->
  3. <runMultipleSimulations>false</runMultipleSimulations> <!-- if the plugin should run multiple simulations sequentially -->
  4. <includes> <!-- include filters, see dedicated section below -->
  5. <include></include>
  6. </includes>
  7. <excludes> <!-- exclude filters, see dedicated section below -->
  8. <exclude></exclude>
  9. </excludes>
  10. <noReports>false</noReports> <!-- to disable generating HTML reports -->
  11. <reportsOnly></reportsOnly> <!-- to only trigger generating HTML reports from the log file contained in folder parameter -->
  12. <runDescription>This-is-the-run-description</runDescription> <!-- short text that will be displayed in the HTML reports -->
  13. <skip>false</skip> <!-- skip executing this plugin -->
  14. <failOnError>true</failOnError> <!-- report failure in case of assertion failure, typically to fail CI pipeline -->
  15. <continueOnAssertionFailure>false</continueOnAssertionFailure> <!-- keep on executing multiple simulations even if one fails -->
  16. <useOldJenkinsJUnitSupport>false</useOldJenkinsJUnitSupport> <!-- report results to Jenkins JUnit support (workaround until we manage to get Gatling support into Jenkins) -->
  17. <jvmArgs>
  18. <jvmArg>-DmyExtraParam=foo</jvmArg> <!-- pass extra parameters to the Gatling JVM -->
  19. </jvmArgs>
  20. <overrideJvmArgs>false</overrideJvmArgs> <!-- if above option should override the defaults instead of replacing them -->
  21. <propagateSystemProperties>true</propagateSystemProperties> <!-- if System properties from the maven JVM should be propagated to the Gatling forked one -->
  22. <compilerJvmArgs>
  23. <compilerJvmArg>-DmyExtraParam=foo</compilerJvmArg> <!-- pass extra parameters to the Compiler JVM -->
  24. </compilerJvmArgs>
  25. <overrideCompilerJvmArgs>false</overrideCompilerJvmArgs> <!-- if above option should override the defaults instead of replacing them -->
  26. <extraScalacOptions> <!-- extra options to be passed to scalac -->
  27. <extraScalacOption></extraScalacOption>
  28. </extraScalacOptions>
  29. <disableCompiler>false</disableCompiler> <!-- if compiler should be disabled, typically because another plugin has already compiled sources -->
  30. <simulationsFolder>${project.basedir}/src/test/scala</simulationsFolder> <!-- where the simulations to be compiled are located -->
  31. <resourcesFolder>${project.basedir}/src/test/resources</resourcesFolder> <!-- where the test resources are located -->
  32. <resultsFolder>${project.basedir}/target/gatling</resultsFolder> <!-- where the simulation log and the HTML reports will be generated -->
  33. </configuration>
包含/排除过滤器

运行多个模拟时,您可以使用includesexcludes过滤器控制哪些模拟将被触发。那些使用ant模式语法并与类名匹配。另请注意,这些过滤器仅适用于从设置插件的项目中的源编译的类。

  1. <configuration>
  2. <!-- ... -->
  3. <runMultipleSimulations>true</runMultipleSimulations>
  4. <includes>
  5. <include>my.package.*</include>
  6. </includes>
  7. <excludes>
  8. <exclude>my.package.IgnoredSimulation</exclude>
  9. </excludes>
  10. </configuration>

注意:过滤器的顺序对执行顺序没有影响,模拟将按字母顺序按类名排序。

禁用编译器

默认情况下,gatling-maven-plugin负责编译Scala代码,因此您可以直接运行。mvn gatling:execute

然后,由于某种原因,你可能想要另一个插件,如scala-maven-pluginscalor-maven-plugin,负责编译。然后,您可以禁用Gatling编译器,这样就不会编译两次:

  1. <configuration>
  2. <disableCompiler>true</disableCompiler>
  3. </configuration>
覆盖logback.xml文件

您可以logback-test.xml拥有优先于嵌入logback.xml文件的优先级,也可以添加JVM选项-Dlogback.configurationFile=myFilePath

使用IDE

您可以使用任何Scala语法高亮的文本编辑器编辑Simulation类。但如果您是开发人员,您很可能希望将自己喜欢的IDE与Gatling一起使用。

Gatling正式支持IntelliJ IDEA和eclipse。

IntelliJ IDEA

您需要安装社区版中提供的Scala插件。然后,您就可以使用Scala源直接导入常规maven或sbt项目。

Eclipse

您必须安装ScalaIDE,最好是最新版本,甚至是里程碑。

遗憾的是,截至今天,ScalaIDE仅适用于Eclipse 4.7(Oxygen),并且与更现代的版本不兼容。

请注意,Eclipse 4.7不支持Java 9+,因此如果您的计算机上安装了多个Java,则可能必须强制使用JVM eclipse.ini,例如:

  1. -vm
  2. /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
SBT

如果你正在使用sbt,你可以使用sbteclipse来生成eclipse项目配置。

Maven

如果您正在使用maven,则可以将scala-maven-pluginm2eclipse-scala结合使用。前者将编译Scala代码,后者将执行ScalaIDE和m2e(maven的eclipse插件)之间的集成。

您必须在pom.xml中添加以下部分:

  1. <build>
  2. <sourceDirectory>src/main/scala</sourceDirectory>
  3. <testSourceDirectory>src/test/scala</testSourceDirectory>
  4. <plugins>
  5. <plugin>
  6. <groupId>net.alchim31.maven</groupId>
  7. <artifactId>scala-maven-plugin</artifactId>
  8. <version>MANUALLY_REPLACE_WITH_LATEST_VERSION</version>
  9. <configuration>
  10. <args>
  11. <arg>-target:jvm-1.8</arg>
  12. <arg>-deprecation</arg>
  13. <arg>-feature</arg>
  14. <arg>-unchecked</arg>
  15. <arg>-language:implicitConversions</arg>
  16. <arg>-language:postfixOps</arg>
  17. </args>
  18. </configuration>
  19. <executions>
  20. <execution>
  21. <goals>
  22. <goal>compile</goal>
  23. <goal>testCompile</goal>
  24. </goals>
  25. </execution>
  26. </executions>
  27. </plugin>
  28. </plugins>
  29. </build>

您也可以使用scalor-maven-plugin

您必须在pom.xml中添加以下部分:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <artifactId>maven-compiler-plugin</artifactId>
  5. <version>3.8.0</version>
  6. <configuration>
  7. <skip>true</skip>
  8. <skipMain>true</skipMain>
  9. </configuration>
  10. </plugin>
  11. <plugin>
  12. <groupId>com.carrotgarden.maven</groupId>
  13. <artifactId>scalor-maven-plugin_2.12</artifactId>
  14. <version>MANUALLY_REPLACE_WITH_LATEST_VERSION</version>
  15. <configuration>
  16. <zincOptionsScala>
  17. -target:jvm-1.8
  18. -deprecation
  19. -feature
  20. -unchecked
  21. -language:implicitConversions
  22. -language:postfixOps
  23. </zincOptionsScala>
  24. </configuration>
  25. <executions>
  26. <execution>
  27. <goals>
  28. <goal>eclipse-config</goal>
  29. <goal>eclipse-format</goal>
  30. <goal>eclipse-restart</goal>
  31. <goal>eclipse-prescomp</goal>
  32. <!-- <goal>register-main</goal> --> <!-- uncomment if you have some Scala code to compile in src/main/scala -->
  33. <goal>register-test</goal>
  34. <!-- <goal>compile-main</goal> --> <!-- uncomment if you have some Scala code to compile in src/main/scala -->
  35. <goal>compile-test</goal>
  36. </goals>
  37. </execution>
  38. </executions>
  39. </plugin>
  40. </plugins>
  41. </build>
  1.  

从IDE启动加特林

gatling-highcharts-maven-archetype生成,您可以使用从您的IDE手动启动加特林和记录一些辅助类。可以完美复制这3个类EngineRecorderIDEPathHelper在自己的项目)。

以上参考官网介绍:

https://gatling.io/

初次接触Gatling

文件目录介绍

  1. Gatling_Home
  2. ├── bin 执行程序
  3. ├── gatling.bat -- 启动入口(windows)
  4. ├── gatling.sh -- 启动入口(linux)
  5. ├── recorder.bat -- UI记录入口(windows)
  6. ├── recorder.sh -- UI记录入口(linux)
  7. ├── conf 配置信息
  8. ├── gatling.conf -- 加特林配置文件
  9. ├── gatling-akka.conf -- 加特林akka配置文件
  10. ├── logback.xml -- 日志配置文件
  11. ├── recorder.conf -- recorder配置文件
  12. ├── lib 加特林依赖jar
  13. ├── results 测试报告
  14. ├── target 编译类
  15. ├── user-files 用户文件
  16. ├── LICENSE 许可证

How to run it

进入bin目录可以看到下面两个文件(.bat属于windows下面的可执行脚本)

gatling.sh 启动入口 依次输入以下三个参数

  • 执行的脚本序号

  • 本次测试Id,用作测试报告命名前缀,不能包含空格,特殊字符,中文等

  • 本次测试描述(非必须),会显示在报告头部

record.sh

UI操作,它主要用于将浏览器配置代理后记录用户操作然后生成测试脚本,更多的用于用户行为模拟测试。

测试运行

首先肯定是要下载它

http://gatling.io/#/download

解压并进入到bin目录下运行sh gatling.sh(linux环境下)

上面列出的就是官方自带的测试脚本样例,我们试着跑下。

输入0.就能看到窗口开始跳动字节了!

显示上面的信息表示测试程序已经运行完成,最后一行显示的是本次的测试报告,可以打开瞅瞅,风骚的报告自己体会吧,首次介绍就先到这里了。

部分报告截图如下所示:

其他

关于负载,性能测试工具-Gatling详解到这里就结束了。

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!

版权声明:

作者:穆书伟

博客园出处:https://www.cnblogs.com/sanshengshui

github出处:https://github.com/sanshengshui    

个人博客出处:https://sanshengshui.github.io/

负载,性能测试工具-Gatling的更多相关文章

  1. Gatling新一代压力测试工具,新一代服务器性能测试工具Gatling

    Gatling新一代压力测试工具新一代服务器性能测试工具Gatlinghttp://www.infoq.com/cn/articles/new-generation-server-testing-to ...

  2. 新一代服务器性能测试工具Gatling

    新一代服务器性能测试工具Gatlinghttp://automationqa.com/forum.php?mod=viewthread&tid=2898&fromuid=2

  3. Tools - 负载性能测试工具JMeter

    JMeter简介 HomePage:http://jmeter.apache.org/ Apache JMeter是Apache组织开发的基于Java的开源负载性能测试工具. 可以用于对服务器.网络应 ...

  4. 性能测试工具Gatling - 设置Recorder

    Gatling自带的Recorder,可以大大节省我们书写scenario的时间.     用法和selenium的IDE类似,作为一个代理服务器在browser和application之间做桥梁作用 ...

  5. 性能测试工具之Gatling

    转载:http://ningandjiao.iteye.com/blog/2004579 Gatling一直是久闻其名但是未得机会运用,正好最近有需求做性能测试,于是趁此机会熟悉了一下,可以说,这是目 ...

  6. Web Service 性能测试工具比较

    背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力(请求数/秒).以微信服务器为例,每个用户用独立的登录token,做各种操作, ...

  7. 性能测试工具 Web Service 性能测试工具比较

    [转自]https://testerhome.com/topics/3003 背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力 ...

  8. 应用性能测试神器 Gatling,你用过吗?

    在应用程序上线之前,有多少人做过性能测试? 估计大部分开发者更多地关注功能测试,并且会提供一些单元测试和集成测试的用例.然而,有时候性能漏洞导致的影响比未发现的业务漏洞更严重,因为性能漏洞影响的是整个 ...

  9. 性能测试工具 转自https://yq.aliyun.com/articles/35149?spm=5176.100239.blogcont35147.8.rsow6k

    摘要: 继续这个系列的学习,这一节重点介绍目前流行的性能测试工具以及如何选择适合项目的工具.在此之前,我已经对性能测试工具的原理与架构做了分析. http://www.cnblogs.com/fnng ...

随机推荐

  1. 关于运行springboot时报Unregistering JMX-exposed beans on shutdown的解决方案

    其实这个错误并不影响程序的运行,但是对于处女座的同仁来说,看到报错难免不舒服,那么看看解决方法,此错误信息的意思是说:在关机状态下未注册jmx暴露的bean. 解决方案是在入口类上加上  @Enabl ...

  2. python笔记:#007#变量

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  3. 1 Numpy-科学计算

    在Python中,使用list可以保存一组值,可以作为数组使用,但是比较浪费内存和时间.类似的array模块,不支持多维,也没有各种函数运算,因此也极其不方便. 为解决这一问题,Python提供了Nu ...

  4. JS 数据类型、赋值、深拷贝和浅拷贝

    js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 ...

  5. Netty中如何序列化数据

    JDK提供了ObjectOutputStream和ObjectInputStream,用于通过网络对POJO的基本数据类型和图进行序列化和反序列化.该API并不复杂,而且可以被应用于任何实现了java ...

  6. java对象深复制、浅复制(深拷贝、浅拷贝)的理解

    先看一个例子 User user1 = new User(); user1.setId("111"); Map<String, User> map1 = new Has ...

  7. linux 获取网络状态信息(Rtnetlink)

    一.Rtnetlink Rtnetlink 允许对内核路由表进行读和更改,它用于内核与各个子系统之间(路由子系统.IP地址.链接参数等)的通信, 用户空间可以通过NET_LINK_ROUTER soc ...

  8. centos tftp和samba的安装与配置

    Tftp服务器的安装于配置 1 安装: 命令:#yum –y install tftp 2 安装完毕之后,将tftp服务器设置为开机启动,方法:(命令)#setup→选择system server→选 ...

  9. Git Submodule简单操作

    基于组件的项目很多,但是如果直接用包的方式直接引用到项目中,如果出现问题很难进行调试的操作,也很难进行组件的优化和管理,所以写了一篇文章来介绍下git submodule的用法,用submodule可 ...

  10. Java描述数据结构之链表的增删改查

    链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础 ...