1.介绍

在本教程中,我们将了解如何使用进行分布式性能测试加特林.在这个过程中,我们将创建一个简单的应用程序来使用Gatling进行测试,了解使用分布式性能测试的基本原理,最后,了解在Gatling中可以获得哪些支持来实现它。

2.使用Gatling进行性能测试

性能测试是一种测试实践,在一定的工作负载下评估系统的响应性和稳定性. 通常有几种类型的测试需要进行性能测试。这些测试包括负载测试、压力测试、浸泡测试、尖峰测试和其他一些测试。所有这些都有自己的具体目标要实现。

然而,任何性能测试的一个常见方面是模拟工作负载和工具加特林吉米特,及转K6帮助我们做到这一点。但是,在继续之前,我们需要一个可以测试性能的应用程序。

然后,我们将为这个应用程序的性能测试开发一个简单的工作负载模型。

2.1.创建应用程序

对于本教程,我们将创建一个简单的Spring Boot web应用程序使用Spring CLI:

Spring init——dependencies=web my-application

接下来,我们将创建一个简单的REST API,它根据请求提供一个随机数:

@RestController @SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} @GetMapping("/api/random") public Integer getRandom() {random random = new random ();返回random.nextInt (1000);}}

这个API没有什么特别之处—它只是在每次调用时返金宝搏官网188be回一个范围为0到999的随机整数。

使用Maven命令启动此应用程序非常简单:

mvnw spring-boot:跑

2.2.创建工作负载模型

如果我们需要将这个简单的API部署到生产环境中,我们需要确保它能够处理预期的负载并仍然提供所需的服务质量。这是我们需要执行各种性能测试的地方。一个工作负载模型通常标识一个或多个工作负载配置文件,以模拟实际使用情况

对于一个具有用户界面的web应用程序,定义一个合适的工作负载模型是相当具有挑战性的。但是对于我们的简单API,我们可以对负载测试的负载分布做一些假设。金宝搏官网188be

加特林提供Scala DSL创建要在模拟中测试的场景.让我们从为之前创建的API创建一个基本场景开始:

包randomapi导入io.gatling.core.Predef.\uImport io.gatling.core.structure.ScenarioBuilder导入io.gatling.http.Predef.\uImport io.gatling.http.protocol.HttpProtocolBuilder类RandomAPILoadTest扩展模拟{val协议:HttpProtocolBuilder=http.baseUrl(“http://localhost:8080/)val scn:ScenarioBuilder=场景(“随机数API的负载测试”).exec(http(“Get Random Number”).Get(“API/Random”).check(status.is(200)))val duringSeconds:Integer=Integer.getInteger(“duringSeconds”,10)val constantUsers:Integer=Integer.getInteger(“constantUsers”,10)setUp(scn.inject(constantConcurrentUsers)(constantUsers)duringSeconds)期间)。协议断言(global.responseTime.max.lt(20000),global.successfulRequests.percent.gt(95))}

让我们讨论一下这个基本模拟的要点:

  • 我们首先添加一些必要的Gatling DSL导入
  • 接下来,定义HTTP协议配置
  • 然后,我们用对API的单个请求定义一个场景
  • 最后,我们为想要注入的负载创建一个模拟定义;这里,我们使用10个并发用户在10秒内注入负载

为具有用户界面的更复杂的应用程序创建这种场景可能非常复杂。谢天谢地,加特林带来了另一个公用事业,叫做录音机使用这个记录器,我们可以通过让它代理交互来创建场景在浏览器和服务器之间。它还可以消耗大量的能量HAR(HTTP存档)文件创建场景。

2.3。执行仿真

现在,我们准备执行负载测试。为此,我们可以放置模拟文件“randomapilloadtest”。目录中的Scala“% GATLING_HOME % /用户文件/ randomapi /”。请注意,这不是执行模拟的唯一方法,但肯定是最简单的方法之一。

我们可以通过运行以下命令启动Gatling:

GATLING_HOME / bin / gatling.sh美元

这将提示我们选择要运行的模拟:

选择一个模拟数字:[0]randomapi。RandomAPILoadTest

选择模拟后,它将运行模拟并生成带有摘要的输出:

此外,它在目录“%GATLING\u HOME%/results”中生成HTML格式的报告:

这只是报告的一部分已经生成,但我们可以清楚地看到摘要结果如何。这是非常详细和容易遵循的。

3.分布式性能测试

到目前为止,一切顺利。但是,如果我们回想一下,性能测试的目的是模拟真实的工作负载。这对于流行的应用程序,它的负载是否会比我们在这里看到的小例子中所看到的负载高得多.如果我们在测试总结中注意到,我们设法实现了大约500个请求/秒的吞吐量。对于现实生活中的应用程序,处理现实生活中的工作负载,这可能要高很多倍!

我们如何使用性能工具模拟这种工作负载?仅仅从一台机器注入负载,真的有可能实现这些数字吗?也许不是。即使负载注入工具可以处理高得多的负载底层操作系统和网络有其自身的局限性

这就是我们必须在多台机器上分配负载注入的地方。当然,与其他任何分布式计算模型一样,这也有其自身的挑战:

  • 我们如何在参与的机器之间分配工作负载?
  • 谁协调他们的完成和从可能发生的任何错误中恢复?
  • 我们如何收集和总结合并报告的结果?

分布式性能测试的典型体系结构使用主节点和从节点来解决以下问题:

但是,再问一次,如果master坏了怎么办?这不在本教程的范围内对分布式计算的关注,但是在选择用于性能测试的分布式模型时,我们当然必须强调它们的含义。

4.Gatling分布式性能测试

现在我们已经理解了分布式性能测试的需求,我们将看到如何使用Gatling来实现这一点。的集群模式是加特林前线的固有特征.然而,前线是Gatling的企业版,并不是开源的。Frontline支持在本地部署注入器,或者在任何流行的云供应商上部署注入器。

然而使用Gatling开源软件仍然可以实现这一点.但是,大部分的重活都得我们自己来做。在这一节中,我们将介绍实现它的基本步骤。这里,我们将使用前面定义的相同模拟来生成多机负载。

4.1.设置

我们先从创建一个控制器机器和几个远程工作机器,本地或任何云供应商。我们必须在所有这些机器上执行某些先决条件。这些包括在所有工作机器上安装Gatling开源,以及设置一些控制器机器环境变量。

为了获得一致的结果,我们应该在所有工作机器上安装相同版本的Gatling,每个机器上的配置都相同。这包括我们在其中安装Gatling的目录和我们创建用于安装它的用户。

让我们看看需要在控制器机器上设置的重要环境变量:

HOSTS=(192.168.x.x192.168.x.x192.168.x.x)

我们还将定义用于从以下位置注入负载的远程工作计算机列表:

GATLING\u HOME=/GATLING/GATLING-charts-highcharts-1.5.6 GATLING\u SIMULATIONS\u HOME/user files/SIMULATIONS\u NAME='randomapi.RandomAPILoadTest'GATLING\u RUNNER=$GATLING\u HOME/bin/GATLING.sh GATLING\u REPORT\u DIR=$GATLING\u HOME/results/GATLING\u REPORTS\u DIR=/GATLING/

一些变量指向Gatling安装目录和启动模拟所需的其他脚本。它还提到了我们希望生成报告的目录。稍后我们将看到在何处使用它们。

注意这一点很重要我们假设机器有一个类似linux的环境.但是,我们可以很容易地将该程序应用于其他平台,如Windows。

4.2.分配负载

来,我们来将相同的场景复制到多个工作计算机我们之前创建的。有几种方法可以将模拟复制到远程主机。最简单的方法就是使用scp支持主机。我们也可以使用shell脚本自动完成:

在"${HOSTS[@]}"中执行scp -r $GATLING_SIMULATIONS_DIR/*(电子邮件保护)主持人:GATLING_SIMULATIONS_DIR美元了

上面的命令将本地主机上目录的内容复制到远程主机上的目录。对于windows用户,腻子是一个更好的选择,它还附带了PSCP (PuTTY安全复制协议)。我们可以使用PSCP传输文件在Windows客户端和Windows或Unix服务器之间。

4.3.执行模拟

一旦我们把模拟复制到工作机器上,就可以启动它们了。实现并发用户数的关键是几乎同时在所有主机上执行模拟

我们可以使用shell脚本自动完成这一步:

对于“${HOSTS[@]}”中的主机,请执行ssh-n-f(电子邮件保护)$HOST\'sh-c'nohup$GATLING\u RUNNER-nr-s$SIMULATION\u NAME\>/GATLING/run.log 2>&1&“完成”

我们使用ssh在远程工作机器上触发模拟。这里需要注意的关键是我们正在使用“无报告”选项(-nr)。这是因为我们在此阶段只对收集日志感兴趣,稍后我们将通过合并所有工作机器的日志来创建报告。

4.4。收集结果

现在,我们需要收集所有工作计算机上模拟生成的日志文件.这是我们可以使用shell脚本自动执行的东西,并在控制器机器上执行:

对于“${HOSTS[@]}”中的主机,请执行ssh-n-f(电子邮件保护)$HOST \ "sh -c 'ls -t $GATLING_REPORT_DIR | head -n 1 | xargs -I {} \ mv ${GATLING_REPORT_DIR}{} ${GATLING_REPORT_DIR}report'" scp . sh -c 'ls -t $GATLING_REPORT_DIR(电子邮件保护)$HOST:${GATLING\u REPORT\u DIR}REPORT/simulation.log\${GATHER\u REPORTS\u DIR}simulation-$HOST.log done

对于我们这些不熟悉shell脚本的人来说,这些命令可能看起来很复杂。但是,当我们把它们分成几个部分时,就没有那么复杂了。首先,我们ssh在远程主机中,按时间倒序列出Gatling报告目录中的所有文件,并取第一个文件。

然后,我们将选择的日志文件从远程主机复制到控制器机器,并重命名它以附加主机名。这一点很重要,因为我们将有多个来自不同主机的具有相同名称的日志文件。

4.5。生成一个报告

最后,我们必须从从不同工作机器上执行的模拟中收集的所有日志文件生成一个报告.值得庆幸的是,加特林承担了所有繁重的工作:

mv$GARGET\U REPORTS\U DIR$GATLING\U REPORT\U DIR$GATLING\U RUNNER-ro报告

我们将所有日志文件复制到标准的Gatling报告目录中,并执行Gating命令生成报告。这假设我们也在控制器机器上安装了Gatling。最终的报告与我们之前看到的类似:

在这里,我们甚至没有意识到负载实际上是从多台机器注入的!我们可以清楚地看到,当我们使用三台工作机器时,请求的数量几乎增加了两倍。然而,在现实生活中,比例不会是这样完美的线性!

5.可伸缩性能测试的注意事项

我们已经看到,分布式性能测试是一种扩展性能测试以模拟实际工作负载的方法。现在,虽然分布式性能测试很有用,但它确实有其细微差别。因此,,我们肯定应该尝试尽可能地垂直扩展负载注入能力.只有当我们在一台机器上达到垂直极限时,我们才应该考虑使用分布式测试。

通常,在机器上扩展负载注入的限制因素来自底层操作系统或网络。我们可以做一些优化来让它变得更好。在类linux环境中加载注入器可以生成的并发用户数量通常受打开文件限制. 我们可以考虑使用文件描述符命令

另一个重要因素与机器上的可用资源有关。例如,负载注入通常会消耗大量的网络带宽。如果机器的网络吞吐量是限制因素,我们可以考虑升级它。类似地,机器上可用的CPU或内存也可能是其他限制因素。在基于云的环境中,切换到功能更强大的机器相当容易

最后,我们在模拟中包含的场景应该是有弹性的,因为我们不应该假设总是在负载下有积极的响应。因此,我们应该谨慎和防御性地书写我们对回应的断言。同时,我们应该把断言的数量控制在最低限度为了节省增加吞吐量的工作量。

6.结论

在本教程中,我们介绍了使用Gatling执行分布式性能测试的基础知识。我们创建了一个简单的测试应用程序,在Gatling中开发了一个简单的模拟,然后了解了如何在多台机器上执行此操作。

在此过程中,我们还了解了分布式性能测试的必要性以及与之相关的最佳实践。

通用的底部

从Spring 5和Spring Boot 2开始学习的春天课程:

>>查看课程
这篇文章的评论已经关闭!