本教程包含针对ArcGIS Server服务创建和运行动态负载测试的策略和过程,并假设您熟悉Apache JMeter的一些基础知识。如果您是Apache JMeter的新手,请参阅我们的使用Apache JMeter进行性能测试(介绍)。
在深入了解构建和验证数据驱动负载测试的细节之前,首先讨论一些特定于JMeter的测试策略是很重要的。这些建议不同于我们的ArcGIS服务器部署负载测试推荐策略文章,用于任何测试工具(但也适用于JMeter)。
可以帮助在JMeter中管理多个测试和多个报告的一种策略是实现一个简单但一致的文件夹结构,用于存储每个测试的各种元素。JMeter测试的主要驱动程序是JMX文件……这是所有测试逻辑所在的地方。但是,随着您继续向测试中添加特性并多次运行它,您将扩展到仅仅管理单个JMX文件之外。
一点小小的组织就有很长的路要走……手动创建几个关键目录可以帮助管理随着时间的推移将填充硬盘驱动器的各种JMeter文件。
注意:这种方法是从操作系统的文件系统中完成的,而不是直接从Apache JMeter中完成的。
推荐的文件夹结构:
在“project”文件夹中,将创建5个空目录:数据集、日志、报告、结果和上传。
像上面提到的文件夹结构一样,利用用户定义变量是一种有利于可移植性、可重用性和测试计划共享的测试构建策略。ArcGIS服务测试中使用的一些常用变量有:
在JMeter测试计划中,这些变量可以很容易地引用如下表示法:${名}它将在执行时自动替换为服务的名称。如果您打算在另一个环境中使用测试,那么使用变量比使用硬编码值更不容易出错。当测试在另一个部署上运行时,测试人员只需要调整变量定义。对于具有许多已定义HTTP请求示例的测试计划,这可以真正节省时间。
在定义步进加载逻辑时,有几种选择。它们都很相似,提供相同的基本功能,但确实有一些细微的区别。线程组是一个很好的、安全的选择,它提供了最大的测试可移植性,因为它包含在核心JMeter产品中。
也就是说,使用JMeter插件管理器(作为插件管理器的一部分安装)使用Apache JMeter进行性能测试(介绍))添加“自定义线程组”可以在这个领域为测试环境提供一些其他有用的选项。
从JMeter的插件管理器(选项->)插件管理器):
一旦安装了“自定义线程组”插件,推荐的线程组替代方案是bzm——并发线程组因为它允许直接的步骤配置,可以直观地呈现定义的压力,从测试的角度来看,这是一个很好的验证特性。
将事务添加到测试中可能是一种有用的分组方式属于同一“操作”的一个或多个类似请求。例如,加载应用程序、导航地图缩放或表单搜索。使用这样的事务可以极大地帮助分析,因为它将操作(例如表单搜索)隔离到它自己的逻辑“容器”中,只有负责其功能的请求。然而,将针对许多不同功能或服务的许多请求扔到一个大组中会使测试后研究变得非常困难。对于事务,可以进行分析,分别了解每个操作的性能。
注意:地图应用程序和工作流各不相同;有些操作的事务由许多请求组成,有些操作的事务只有一个请求。
注意:测试中不同操作的性能并不总是以相同的方式扩展;有些人可能比其他人做得更好;能够识别性能较差的操作(通过唯一的事务名称)是很好的分析。
确保从远程服务器返回预期的响应与发送请求一样重要。由于各种原因,当测试像服务这样的ArcGIS资源时,仅仅依赖HTTP状态码(例如HTTP 200)是不够的。
验证响应的一种方法是在Header或Body中查找关键字。如果请求PNG图像,但返回文本错误消息,则在Header中查找“image/ PNG”的响应断言规则将把该尝试标记为失败的。如果它出现在Header中,则被认为是通过了请求。
注意:对于需要在JMeter测试计划中检查的每个HTTP请求,必须添加响应断言规则。
使用上述策略,可以创建一个灵活且通用的JMeter测试计划,该计划可以对每个请求从ArcGIS地图服务调用不同的兴趣区域。“动态测试”是理想的,因为与每次请求相同的数据相比,它可以使服务器资源更加努力地工作。这样的测试更能代表现实世界的情况。
作为一名性能测试人员,我们希望采用如下的导出映射请求签名,并将其转换为动态JMeter负载测试:
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image
JMeter提供了几种在测试计划中构建HTTP有效负载的方法,例如:
本文将重点介绍第一种方法,该方法展示了手动创建JMeter测试的实践,如何组装请求的组件以及如何使其行为“动态”。这个数据驱动的测试将通过导出函数调用SampleWorldCities地图服务(在本地部署上运行)。
注意:从许多方面来看,SampleWorldCities被认为是一个小型且非常轻量级的地图服务,但考虑到它在ArcGIS Server部署中无处不在,使用它来完成负载测试的创建是理想的。
使用bzm -并发线程组插件,可以很容易地看到并在上面的图表中直观地确认配置的步加载逻辑。此测试将设置为运行20分钟,将通过使用10个不同的步骤(每2分钟增加1个并发测试线程)来增加压力,达到最多10个并发测试线程,然后将停止。
现在我们想要创建一个数据驱动的HTTP请求,它将对每个请求请求不同的空间范围。这是通过常规的JMeter HTTP请求完成的。
输出映射的请求签名,如:
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image
包含几个URL组件,这些组件需要转到HTTP Request页面上的不同位置(以最大限度地提高灵活性和维护)。让我们通过分离URL参数从请求的键/值对开始。
下面的参数部分被修改为包含几个JMeter变量,而不是原始值。有些部分将引用尚未在测试中创建的JMeter变量名,这是可以的。
dpi = 96透明= true&format = png32&layers = % 3展示a0 % 2 c1 % 2 c2&bbox = $ {bbox_9244649} &bboxSR = $ {sr_9244649} &imageSR = $ {sr_9244649}大小= $ {width_9244649} {height_9244649}加元% 2 f =形象
这将有助于将使HTTP请求的某些部分动态所需的几个部分放在适当的位置。
bbox,宽度,高度,mapUnits、sr、规模
-108.76228873935, 31.0409016308382, -88.8526618315487, 46.9686031570791, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
23.1282001284589, 34.337748761293, 43.03782703626, 50.2654502875339, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
-117.052786808947, 35.3545948648786, -97.1431599011459, 51.2822963911194, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
-100.83549484975, 36.0637839078502, -80.9258679419492, 51.991485434091, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
17.7030587822399, 34.3302705716379, 37.6126856900409, 50.2579720978788, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
32.2827904735659, 37.2792197897781, 52.192417381367, 53.2069213160189, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
0.222469446585188, 35.0562794764081, 20.1320963543862, 50.9839810026489, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
100.262489726575, 20.8660021309943, 120.172116634376, 36.7937036572352, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
72.4186084471192, 22.1748804724666, 92.3282353549203, 38.1025819987075, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
-61.2094273153097, -26.7402777397378, -41.2998004075086, -10.812576213497, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
-72.5908131920005, -26.6270515481087, -52.6811862841995, -10.6993500218679, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
99.7474167083529, 20.7088254145549, 119.657043616154, 36.6365269407958, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
102.59837658124, 20.384726879328, 122.508003489041, 36.3124284055689, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
80.8239612278688, 23.4521454643548, 100.73358813567, 39.3798469905956, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
-105.812716128284, 31.0536390717042, -85.9030892204829, 46.9813405979451, 1280年,1024年,esriDecimalDegrees, 4326, 9244649
注意:此信息对于验证测试回放非常有用,但对于性能故障排除也很有用
自上次保存以来,进行了许多更改。
要下载本文中使用的Apache JMeter测试计划,请参见:sampleworldcities1.zip
要下载这个Apache JMeter测试计划的一个版本,包含更多详细信息,请参见:sampleworldcities2.zip
Apache JMeter团队建议不从GUI运行负载测试,而不是从命令行调用测试,以获得最佳性能和资源利用率。由于这个过程可能涉及到几个开关,参数调整和检查,值得详细讨论,这是一个值得单独讨论的过程:从命令行模式运行Apache JMeter负载测试(初级/中级)。
注意:如果您的Apache JMeter测试将向可能影响其他用户的服务器发送请求,请与您的GIS团队协调。负载测试应该安排在非高峰业务时间运行。
Apache JMeter根据Apache2.0许可。Apache、Apache JMeter、JMeter、Apache羽毛和Apache JMeter标志是Apache软件基金会的商标。
您必须是注册用户才能添加评论。如果您已经注册,请登录。否则,请注册并登录。