转载:https://blog.csdn.net/chiqiao5151/article/details/100725264?utm_medium=distribute.pc_relevant.none-task-blog-title-8&spm=1001.2101.3001.4242
nGrinder简介&架构
nGrinder管理员指南
1、nGrinder安装指南
2、nGrinder管理员指南
3、nGrinder控制器配置指南
4、nGrinder集群指南
5、nGrinder代理配置指南
6、nGrinder代理自动更新
7、nGrinder私有代理
nGrinder用户指南
1、nGrinder快速入门
2、nGrinder测试配置
3、如何通过线程逐步提升压力
4、nGrinder使用者相关
nGrinder脚本指南
1、nGrinder脚本指南
2、nGrinder脚本收集
3、nGrinder脚本管理
4、nGrinder脚本安全
nGrinder开发文档
nGrinder常见问题
nGrinder是一个用于在多台机器上运行用jython(在JVM上运行的python)编写的测试脚本的应用程序。它的内部引擎是基于Grinder。nGrinder分别用控制器和agent将Grinder的控制台和agent包装起来,并扩展了支持多个并发测试的特性。
nGrinder由两个主要组件组成。
Controller -为性能测试提供web界面。-协调测试过程。-整理和显示测试统计数据。-让用户创建和修改脚本。
Agent——在代理模式下运行时,运行将负载放到目标机器上的进程和线程。在监视器模式下运行时监视目标系统性能(例如:CPU/内存)
当启动代理时,它们尝试连接到控制器。然后它们被附加到AgentControllerServer组件中。AgentControllerServer(类似于代理池)管理当前代理池。每当用户启动性能测试时,就会创建一个新的控制台来协调代理,并从AgentControllerServer移交所需的代理数量。控制台(命名为SingleConsole,以区别于Grinder)将测试脚本和测试资源发送给多个分配的代理,并开始控制测试流,直到测试结束。测试完成后,使用的代理将返回给AgentControllerServer,稍后在其他测试中使用。SingleConsole同样也返回给ConsoleManager。
nGrinder与Grinder最大的区别在于nGrinder在控制器中保留了多个控制台实例和代理。每个控制台独立于其他控制台,所有控制台都可以并发运行。许多代理可以预先添加,并且可以在需要时进行分配。与grinder不同,nGrinder的开发目的是最大化对agent机器的利用率。
众所周知的负载测试工具,如“Performance Center”,都有一个测试保留特性,可以在用户开始测试时保证代理的可用性。但是保留方法会导致代理使用问题。我们观察到,人们倾向于为预防而准备代理,即使他们实际上并没有进行测试。根据我们的经验,平均代理CPU利用率不足10%。
出于这个原因,nGrinder支持多重测试和动态代理分配,因此只有在执行真正的测试时,才会动态地将代理分配给测试。这使得nGrinder成为所有竞争者中唯一的解决方案。由于代理的数量相对较少,多个用户可以同时运行多个测试。可能并发测试的数量取决于自由代理的数量。
集群架构
从nGrinder 3.1版本中,我们引入了nGrinder控制器集群,使性能测试可以由其中一个集群控制器执行,并支持使用多组代理(命名区域)。
下面是没有集群支持的架构。
- nGrinder使用嵌入式svn服务器(SVNKit DAV)来管理脚本文件。svn存储库存储在${NGRINDER_HOME}目录中。
- nGrinder使用EhCache提高DB和SVN存储库的数据检索性能。
- nGrinder使用Spring Security来保护系统,并使用Atlassian插件框架来实现可扩展性。
如果通过配置system.conf启用集群模式,将nGrinder安装到多台机器上,系统架构将变更如下:
- 集群中的所有控制器共享同一个DB和文件系统。所有ngrinder控制器都应该指向由NFS共享的${NGRINDER_HOME}文件夹。
- 每个控制器都可以有自己的特殊属性和日志输出文件夹。这些信息将保存在每个控制器的${NGRINDER_EX_HOME}中。
- 所有控制器相互复制EhCache,使某些数据在集群中的所有控制器中可见。
每个控制器都可以为nGrinder web内容提供服务,但是根据不同的命名区域处理不同的测试集。默认情况下,我们不提供任何会话集群。因此,您可能会遇到登录问题,因为存储在控制器中的会话不会复制到其他控制器。您可能需要通过引用Tomcat会话集群指南来配置它,或者在L4上使用粘性会话。如果您不是这方面的专家,只需让用户只连接一个控制器即可。
如何配置集群? 查看 集群使用指南
先决条件
- nGrinder是web应用程序(控制器)和Java应用程序(代理、监视器)的组合。如果您不知道什么是控制器和代理,请参考 nGrinder简介。
要安装nGrinder控制器和代理,您需要Oracle JDK 1.6~或OpenJDK 1.7~。 - 如果您的java路径位于路径的开头,请检查PATH环境变量,以便能够运行合适的java。
- nGrinder使用多个端口与agent及agent进行通信。如果防火墙阻止了一些端口,您应该要求网络管理员打开防火墙中的以下端口。这些端口可以通过配置进行配置。
- 代理端:Any ==> 控制器:16001
- 代理端:Any ==> 控制器:12000 ~ 12000+(允许并发测试次数)
- 控制器:Any ==> 监视器:13243
- 控制器 ==> 公共用户:这取决于您的tomcat配置。默认情况下,它被设置为8080。
下载
您可以从以下链接下载 nGridner控制器。
安装控制器
nGrinder是作为一个自执行web存档文件(WAR)分发的,就像Jenkins一样,您可以将此存档文件放入您熟悉的web应用服务器(如Tomcat)或在命令行中运行包。
!小心,永远不要将war文件放在包含像这样的文件夹的空间中 "C:Program FilesTomcatwebapps"
通过Docker运行
如果你喜欢通过docker运行。请参阅 https://hub.docker.com/r/ngrinder/controller/
作为可执行文件运行
1、请确保您提前正确配置了PATH和JAVA_HOME。
2、使用以下命令运行nGrinder控制器。
java -jar ngrinder-controller-X.X.war
3、然后您将看到以下错误消息。nGrinder需要非常大的PermGen内存,因为它包含很多库,比如SVNKit、maven、Jetty webserver、groovy和python。重新运行ngrinder,并添加PermGen设置。nGrinder需要相当大的perm-gen内存。请使用以下命令运行nGrinder。
java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.war
4、默认情况下,nGrinder为web服务器端口使用8080。如果您想使用另一个端口,请指定--port port_number作为参数。
java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.war --port 80
5、当执行war文件时,将提取war到 ~/.ngrinder/webapp
目录,并创建多个默认数据文件,比如DBs到.ngrinder
目录
6、如果您可以在屏幕上看到以下日志,那么ngridner控制器现在就可以运行了。
INFO 14. 1. 20 오후 4:39:liquibase: ChangeSet ngrinder_datachange_logfile/db.changelog_schema_22.xml::22::ngrinder.3.3 r
an successfully in 4ms
INFO 14. 1. 20 오후 4:39:liquibase: ChangeSet ngrinder_datachange_logfile/db.changelog_schema_23.xml::23::ngrinder.3.3 r
an successfully in 7ms
INFO 14. 1. 20 오후 4:39:liquibase: ChangeSet ngrinder_datachange_logfile/db.changelog_schema_24.xml::24::ngrinder.3.3 r
an successfully in 2ms
INFO 14. 1. 20 오후 4:39:liquibase: ChangeSet ngrinder_datachange_logfile/db.changelog_schema_25.xml::25::ngrinder.3.3 r
an successfully in 7ms
INFO 14. 1. 20 오후 4:39:liquibase: ChangeSet ngrinder_datachange_logfile/db.changelog_schema_26.xml::26::ngrinder.3.3 r
an successfully in 8ms
2014-01-20 16:39:30.633:INFO:/:Initializing Spring FrameworkServlet 'appServlet'
2014-01-20 16:39:31.141:INFO::Started SocketConnector@@0.0.0.0:8080
7、然后打开浏览器,进入 http://localhost:8080/
运行在TOMCAT
1、将war文件放到tomcat的webapps文件夹${TOMCAT_HOME}/webapps
中。如果您想在没有ngrinder-controller上下文路径的情况下访问ngrinder,您应该将war文件名更改为ROOT.war
。
2、打开 catalina.sh
或者 catalina.bat
,然后把下面的内容放在文件的开头。
JAVA_OPTS="-Xms600m -Xmx1024m -XX:MaxPermSize=200m" # for catalina.sh
set JAVA_OPTS=-Xms600m -Xmx1024m -XX:MaxPermSize=200m # for catalina.bat
3、运行 ${TOMCAT_HOME}/startup.sh
或者 startup.bat
4、打开浏览器访问http://localhost:8080/ngrinder-controller-X.X ,或者如果你将war文件重命名为ROOT.war
则访问 http://localhost:8080
更多
1、nGrinder通过集群多个控制器支持多个区域(运行独立的代理集属于多个网络区域)。参见 控制器集群指南
2、nGrinder有许多可配置选项,可根据每种需求定制nGrinder。参见 控制器配置指南
安装代理端
与以前的nGrinder不一样,nGrinder 3.3 agents是从controller中下载的。下载的代理程序包已经包含连接到控制器的默认代理配置。只要打开tar文件和运行run_agent.sh
或者run_agent.bat
就能让代理连接到控制器。
1、以admin身份登录。默认的管理密码也是admin。
2、单击右上角菜单并单击下载代理菜单。
因为您是以admin身份登录的,所以可下载的代理包包含允许所有用户共享代理的配置。
如果您以非admin帐户的身份登录,链接将被更改为“下载私有代理”,其中包含允许代理只被当前用户占用的配置。
详情请见私人代理。
3、包含代理的tar存档将很快下载。
在widows系统,tar文件能被7zip提取,或者使用tar xvf tar_file.tar
命令
4、解压tar并运行run_agent.sh
或run_agent.bat
。代理将使用以下逻辑执行。
① 检查~/.ngrinder_agent
文件夹,可以看到配置(agent.conf
)是否存在
② 如果不存在,复制当前文件夹的__agent.conf
配置文件到~/.ngrinder_agent/agent.conf
和加载它。
③ 如果它存在,只需使用现有配置~/.ngrinder_agent/agent.conf
直接运行
5、如果您想用最新的配置覆盖现有的配置,请将-o
选项作为参数
run_agent.sh -o # 在 linux/mac 运行
run_agent_bg.sh -o # 在 linux/mac 后台运行
run_agent.bat –o # 在 windows 上运行
6、如果你想停止代理程序。
stop_agent.sh # 在 linux/mac 运行
stop_agent.bat # 在 windows 运行
7、从nGrinder 3.3开始,控制器将自动批准所连接的代理,如果你在控制器中提供下面配置,那您必须自己批准代理。
controller.enable_agent_auto_approval=true
8、要批准代理,请转到代理管理菜单并单击approve按钮。
9、如果在Linux中运行代理,可能需要配置ulimit以运行多个线程。请检查下面的内容。
> ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30676
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 16000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 32768
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
当你运行ulimit -a
时,如果你的机器设置的max user processes
和open files
很小, 请至少设置到10000以上。打开/etc/security/limits.conf
文件,并使用root权限添加一下内容:
your_account soft nproc 32768
your_account hard nproc 32768
root soft nproc 32768
root hard nproc 32768
your_account soft nofile 16000
your_account hard nofile 16000
root soft nofile 16000
root hard nofile 16000
默认情况下,每台机器只支持一个代理。但是,如果希望在一台机器上运行多个代理,则必须配置一些代理选项。请参考 代理配置指南
安装监控器
nGrinder监控器是代理程序包的子集,安装在目标机器中以收集负载下的系统统计信息(如CPU、MEM和网络)。
你也可以从控制器下载监视器。
1、下载监视器。
2、然后解压监视器包并运行批处理或shell文件。
run_monitor_bg.sh # 运行在 linux/mac
run_monitor.bat # 运行在 windows
3、如果要停止监视器,运行以下命令。
stop_monitor.sh # 运行在 linux / mac
stop_monitor.bat –o # 运行在 windows
好了。现在可以运行第一个性能测试了。快速入门
3、管理员指南
第一次访问
根据您如何执行nGrinder,您可能使用不同的URL访问主页。如果你使用java -jar ngrinder-controller-X.X.war
运行代理,你可以通过地址 http://localhost:8080
访问首页。
使用默认帐户登录
nGrinder在第一次运行时创建4个用户。预定义的id如下所示。
每个都有反映其角色的名称。
- admin, user, superuser, system
- 初始密码与名称相同
有4种用户类型(称为角色)
角色 | 描述 |
---|---|
ADMIN | 管理nGrinder系统,包括:用户管理、测试观察、测试报告统计、代理管理等。 |
USER | 测试脚本,然后获取其报告数据文件。 |
SYSTEM_USER | 预留内部使用 |
SUPER_USER | 观察在nGrinder实例中执行的整个测试,但无法配置系统。 |
要配置系统,您需要使用管理帐户登录。
注意:第一次登录时,请不要忘记更改密码。如果您将帐户保留默认密码,则黑客可以使用nGrinder实例进行DDOS攻击。
代理管理
管理菜单中的代理管理提供了代理操作和监控功能。即使您已经将代理配置为连接控制器,您也需要批准控制器中的每个代理以使其有效。这一步是为了防止试图连接到控制器的异常代理滥用控制器。
如果你是管理员,上面的菜单应该是可见的。您可以单击代理管理菜单来管理代理。
然后,您应该会看到上面显示的屏幕。这显示了附加代理的状态。如果我们只允许所有代理连接,就会有潜在的风险。因此,nGrinder只使用经过批准的代理商。如果您确认这里列出的代理是OK的,您可以批准它们。有些代理只能用于特定的用户。详情请参阅 用户代理
您可以通过单击每个IP监视代理的性能状态。
这张图显示了在最后1分钟内每个代理的性能。
在nGrinder 3.3中,agent管理页面包含了agent自动更新功能。有关详细信息,请参阅 代理自动更新
用户管理
管理员可以通过用户管理菜单创建/删除和修改用户。每个用户也可以修改自己的配置文件。
脚本控制台
这是一个常用的调试管理工具。管理员可以输入Groovy代码来监视和控制nGrinder内部状态。例如:
println(agentManager.getAllAttachedAgents())
默认情况下禁用此功能。要启用脚本控制台,请在系统配置中放入以下选项。
controller.enable_script_console=false
知道在脚本中可以引用什么是很重要的。下面的变量是可用的。
- applicationContext (org.springframework.context.ApplicationContext)
- agentManager (org.ngrinder.perftest.service.AgentManager)
- agentManagerService (org.ngrinder.agent.service.AgentManagerService)
- regionService(org.ngrinder.region.service.RegionService)
- consoleManager (org.ngrinder.perftest.service.ConsoleManager)
- userService (org.ngrinder.user.service.UserService)
- perfTestService (org.ngrinder.perftest.service.PerfTestService)
- tagService(org.ngrinder.perftest.service.TagService)
- fileEntryService (org.ngrinder.script.service.FileEntryService)
- config (org.ngrinder.infra.config.Config)
- pluginManager (org.ngrinder.infra.plugin.PluginManager)
- cacheManager(org.springframework.cache.CacheManager)
请参考nGrinder javadoc以了解可用的类和方法。
日志监控
有时,查看服务器日志以确定问题并向开发人员发送错误报告是很重要的。代替了tomcat的默认日志catalina.out
,nGrinder拦截日志系统并写入日志文件 ${NGRINDER_HOME}/logs/ngrinder.log
。您可以在日志监视菜单中看到当前打印日志。每5秒钟刷新一次,以显示最新可用日志。
日志监控在非集群模式下可用。
测试策略
有时候,您需要配置整个测试执行策略。例如,您可以设置每个测试可以使用的代理的最大计数。或者您可以限制测试的最大并发数,以最小化网络负载。可以通过${NGRINDER_HOME}/system.properties
文件进行配置。
4、控制器配置指南
本章描述了高级nGrinder控制器配置。如果您不是系统管理员,您可能不需要阅读本指南。然而,如果您想将nGrinder作为PAAS运行,您应该阅读这一章。
控制器首页
${NGRINDER_HOME}
当nGrinder控制器启动时,nGrinder将创建 ${user.home}/.ngrinder
目录到用户的主目录。此目录包含默认配置文件和数据。下面是.ngrinder
目录的默认位置。
- Window:C:Users${user.home}.ngrinder
- Unix/Linux :${user.home}/.ngrinder
但是如果您想为主目录分配其他目录,请设置环境变量 ${NGRINDER_HOME}
在运行ngrinder之前,您可以在命令行中执行 --ngrinder-home HOME_PATH
java -XX:MaxPermSize=200m -jar ngrinder-controller-X.X.war --ngrinder-home /home/user/ngrinder
如果您想运行多个nGrinder控制器(每个控制器只处理一个网络区域)并使它们作为一个(集群模式)工作,您应该让所有控制器共享相同的${NGRINDER_HOME}
。这通常使用NFS来完成控制器目录共享。有关详细信息,请参阅 集群体系结构。
${NGRINDER_EX_HOME}
${NGRINDER_EX_HOME}
用于在集群模式中每个特定的控制器。默认情况下,它被设置在~/.ngrinder_ex
与${NGRINDER_HOME}
不同,${NGRINDER_EX_HOME}
在nGrinder启动时不会自动创建。
- Window : C:Users${user.home}.ngrinder_ex
- Unix/Linux :${user.home}/.ngrinder_ex
${NGRINDER_EX_HOME}
不是多个控制器共享的主题。每个控制器都可以有自己的扩展home。用户可以添加额外的系统配置在${NGRINDER_EX_HOME}/system.conf
。
控制器首先从 ${NGRINDER_HOME}/system.conf
加载系统配置,然后,它将尝试从 ${NGRINDER_EX_HOME}/system.conf
,并将其覆盖 ${NGRINDER_HOME}/system.conf
上的系统配置。
例如:cluster.region
配置可以设置在每个集群成员的${NGRINDER_EX_HOME}/system.conf
文件中。当${NGRINDER_EX_HOME}
目录存在,且控制器在集群模式下启动,控制器将输出日志到 ${NGRINDER_EX_HOME}/logs/ngrinder_{region_name}.log
文件中。
命令行参数
基础
如果你运行一个没有WAS的控制器。您可以在CLI接口上提供多个选项。
名称 | 示例 | 重载属性 | 描述 |
---|---|---|---|
-p / –port | -p 80 | 服务器的HTTP端口。默认端口是:8080 |
|
-c / --context-path | -c ngrinder | 控制器的Web上下文路径。默认的上下文路径是""。例如,如果您在这里提供"ngrinner",访问url将是"http://localhost:8080/ngrinder" | |
-cm / --cluster-mode | -cm easy | cluster.mode | 集群模式。有三个可用的选项(none /easy /advanced )。默认值为none |
-nh / --ngrinder-home | -nh ~/ngrinder | ngrinder.home | home路径,默认:~/.ngrinder |
-exh / --exhome | -ex ~/ngrinder_ex | ngrinder.exhome | 扩展的home路径,默认:~/.ngrinder_ex |
-h / --help / –? | -h | 帮助文档 | |
-D | -Ddatabase=cubrid &database_url=blar | can override all | 动态属性。这个选项可以覆盖 database.conf 和 system.conf 的所有配置 |
单应用模式
如果在非集群模式下运行ngrinder(这意味着您根本没有提供“-cm”选项),则可以使用以下附加选项。
名称 | 示例 | 重载属性 | 描述 |
---|---|---|---|
-cp / --controller-port | -cp 9000 | controller.port | 代理连接的控制器端口。 |
简单的集群模式
一些公司使用多个idc,它们需要集群(单个nGrinder实例中的多区域支持)特性。然而,3.3版本前的nGrinder要求网络文件系统共享${NGRINDER_HOME}
和Cubrid,以使多个控制器拥有相同的DB。通过允许在一台机器上安装多个控制器并允许H2 TCP服务器连接,我们取消了这些限制。为了理解容易的集群,我们强烈建议阅读我们的 简单集群指南
您可以通过以下命令以集群模式轻松的运行控制器。
java -XX:MaxPermSize=200m -jar ngrinder-controller-X.X.war -cm easy
以下是必选项
名称 | 示例 | 重载属性 | 描述 |
---|---|---|---|
-clh / --cluster-host | -clh 200.1.22.3 | cluster.host | 当前区域的代理连接的控制器ip或主机名。 |
-clp / --cluster-port | -clp 10222 | cluster.port | 此集群成员的集群通信端口。每个集群成员都应该使用唯一的集群端口运行 |
-cp / --controller-port | -cp 9000 | controller.port | 代理连接的控制器端口。每个集群成员都应该使用唯一的控制器端口运行。 |
-r / --region | -region NORTH | cluster.region | 区域名称。每个集群成员应该使用唯一的区域名称运行。 |
-dt / --database-type | -dt h2 | database.type | 数据库类型。有h2和curbrid。 |
-dh / --database-host | -dh localhost | database.host | 数据库主机名。默认值是localhost |
-dp / --database-port | -dp 9092 | database.port | 数据库端口号。当cubrid被选中时,默认值是33000;h2被选中,默认值是9092 |
高级集群模式
java -XX:MaxPermSize=200m -jar ngrinder-controller-X.X.war -cm advanced
高级集群模式没有任何选项。它只是激活集群模式,然后从集群配置${NGRINDER_HOME}/system.conf
或者 ${NGRINDER_EX_HOME}/system.conf
文件中获取。
配置
当控制器启动时,它将默认配置复制到${NGRINDER_HOME}
中。您可以修改它们来设置控制器。
${NGRINDER_HOME}/database.conf
- 这里包含数据库配置。您可以在需要使用Cubrid时修改此文件。默认情况下,nGrinder使用H2作为数据库。
database=H2
database_username=admin
database_password=admin
如果你只设置以上选项,H2将${NGRINDER_HOME}/db/h2.db
创建DB,以嵌入式模式运行。在这种情况下,没有其他进程在运行时不能访问这个数据库。
如果您在服务器模式下运行H2,而不是在自己的嵌入式模式下运行。您还应该提供数据库连接URL。
database_url=tcp://{your_h2_server_host_ip_or_name}:{the_h2_server_port}/db/ngrinder
如果您喜欢使用Cubrid,您需要设置以下配置。
database=cubrid
database_url={your_cubrid_host_ip_or_name}:{cubrid_port_maybe_33000}:{dbname}
database_username=admin
database_password=admin
注意:如果您想使用Cubrid DB高可用性特性。请按照指南在cubrid中启用HA,并在database.conf
添加备选的db地址。
database_url_option=&althosts={you_cubrid_secondary_host_ip_or_name}:{cubrid_port_maybe_33000}
#### ${NGRINDER_HOME}/system.conf
##### Generic
- This contains controller configurations.
- You can modify these settings to calibrate the controller’s behavior.
|Key|Default|Compatible Keys (for ~nGrinder 3.2.X)|Description|
|---|-------|-------------------------------------|-----------|
|controller.verbose|false|verbose|Set true to see the more detailed log.|
|controller.dev_mode|false|testmode|Set true to run controller in dev mode. In the dev mode, the log goes to the default output(such as catalina.log in Tomcat) not ${NGRINDER_HOME}/logs/ and the security mode and cluster config verification are disabled. In addition, "agent force update" and "agent auto approval" is enabled. finally the script console is activated as well.|
|controller.demo_mode|false|demo|Set true to run controller in the demo mode. In the demo mode, each use does not allow to change the user password.|
|controller.security|false|security|Set true if security mode should be enabled. In the secutiry mode, nGrinder SecurityManager will be activated and limit the each test’s access to underlying resources/network in the agent. Please refer [Script Security](script-security)|
|controller.user_password_sha256|false|ngrinder.security.sha256|By default, nGrinder uses sha1 to encode passwords. If you like to use sha256, please set this true. However, you need to delete out all databases completly to apply the this configuration.|
|controller.usage_report|true|usage.report|Set false if you don't want to report ngrinder usage to google analytics. |
|controller.plugin_support|true|pluginsupport|Set false if the plugin should be de-activated. This is not the option applied on the fly. You need to restart the controller.|
|controller.user_security|false|user.security|Set true if you want to make some of the user profile fields(email, mobile phone) mandatory.|
|controller.allow_sign_up|false| |Set true if some users should be able to sign them by themselves. See [TBD](tbd)|
|controller.max_agent_per_test|10|agent.