Jmeter瓶颈
Jmeter bottleneck
我们有一个正在使用 Jmeter 进行测试的系统。我们在 Jmeter 启动测试中遇到以下瓶颈:
症状:
- 我们达到每秒最多 15 个请求 (rps)。
- 此限制是针对每个 Java VM,而不是针对每台计算机。
- CPU 未达到极限,仅在 ca。 30%。该测试与请求一起进行了相当多的预处理和 post 处理,因此这可能是个问题,但事实并非如此。
- 内存(3.5 GiB 的计算机)大约为 . 70% - 80%。这足以提高 rps,因此这不是极限。
- 内存(JVM)已根据建议设置,也进行了多种尝试,但没有改进。
- 我也检查了 TCP 连接,从“使用 keep-alive”到“不使用 keep-alive”的更改没有任何改善(不是预期的)。
- 所有(!)断言都已关闭。
- 日志记录:仅记录响应时间、响应时间百分位数、吞吐量和请求率,以及 jmeter 的标准 table 输出。
- 所有日志文件都保存到本地硬盘。
Jmeter 通过 jmeter.bat 脚本启动,具有以下 JVM 设置:
set HEAP=-Xms768m -Xmx768m -Xss128k
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2
set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000
set PERM=-XX:PermSize=256m -XX:MaxPermSize=256m
set DUMP=-XX:+HeapDumpOnOutOfMemoryError
set DDRAW=
set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %RMIGC% %PERM% %DDRAW% %JM_START% %JM_LAUNCH% %ARGS% %JVM_ARGS% -jar "%JMETER_BIN%ApacheJMeter.jar" %JMETER_CMD_LINE_ARGS%
jmeter.properties有以下内容:
language=en
cookies=cookies
xml.parser=org.apache.xerces.parsers.SAXParser
jmeter.laf.mac=System
jmeter.loggerpanel.maxlength=5000
not_in_menu=HTML Parameter Mask,HTTP User Parameter Modifier
remote_hosts=127.0.0.1
log_level.jmeter=ERROR
log_level.jmeter.junit=ERROR
log_level.jorphan=WARN
log_file='c:\temp\jmeter_'yyyyMMdd'.log'
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss
jmeter.save.saveservice.base_prefix=~/
sampleresult.timestamp.start=true
upgrade_properties=/bin/upgrade.properties
HTTPResponse.parsers=htmlParser wmlParser
htmlParser.types=text/html application/xhtml+xml application/xml text/xml
wmlParser.className=org.apache.jmeter.protocol.http.parser.RegexpHTMLParser
wmlParser.types=text/vnd.wap.wml
summariser.interval=180
summariser.log=true
summariser.out=true
beanshell.server.file=../extras/startup.bsh
time.YMDHMS=yyyyMMdd_HHmmss
onload.expandtree=true
view.results.tree.max_size=0
classfinder.functions.contain=.functions.
classfinder.functions.notContain=.gui.
user.properties=user.properties
system.properties=system.properties
在 jmx
处指定了以下设置:
<stringProp name="ThreadGroup.num_threads">300</stringProp>
<stringProp name="ThreadGroup.ramp_time">0</stringProp>
<stringProp name="ThreadGroup.ramp_time">0</stringProp>
<longProp name="ThreadGroup.start_time">1404986400000</longProp>
<longProp name="ThreadGroup.end_time">1404990000000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration">3600</stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.delayedStart">true</boolProp>
问题:
瓶颈在哪里,如何摆脱?
考虑以下清单:
- 非 GUI 模式是必须
- 全部 监听器需要被禁用
- 如果您使用任何 Beanshell 测试元素 - 安装 groovy 脚本引擎并切换到 JSR223 Sampler 和 groovy 语言
- 有关推荐的 JVM 和 GC 调整,请参阅 JMeter Performance and Tuning Tips 指南
如果以上都没有帮助 - 考虑 remote (distributed) testing
我想提出一些建议,
- 实施 Blazemerter JMeter tips 指定的所有 JMeter 最佳实践(与 Dmitri 提供的 link 相同)这将确保优化脚本。
- 您的计算机有 3.5 GB 或 ram,但您的 JMeter 设置显示,您只提供了最大 768mb 的 JVM 内存。您是否在同一台计算机上启动多个 JMeter 实例?我认为最大堆大小为 2gb 的 JMeter 的单个实例(或为 mmgt 目的创建 2 个实例)应该能够产生 300 个用户负载。
- 虽然测试 运行ning 持续 1 小时,但我看到您的测试的加速时间为 0。对于 300 个用户,所有用户都在 0 秒内上线,这将使系统在开始时过载。真的需要吗?也许您应该增加 10-15 分钟的加速时间和 运行 测试,这将有助于提高 Jmeter 实例的性能。
- 确定您想要生成多少 tps 或 req/sec 如果它出现在您的负载测试计划(或 SLA)中,然后可能使用吞吐量控制器来控制所需的吞吐量。
开始监控 JMeter 实例使用,
JVisualVM : UI 工具,免费软件,很好的细节,易于使用
JMap : UI 和命令行,优秀的细节,易于使用
Jstat : 命令行,系统开销非常低,优秀的细节
并监视负载下的应用程序系统以进行更好的分析。
这也将帮助您找到应用程序方面的瓶颈(如果有的话)。
一般普通用户机器也会有 8gb 内存,dual/quad 核心 cpus,因此一台机器可以产生 500-1000 个用户负载。如果需要,请使用分布式 JMeter 测试。
我们有一个正在使用 Jmeter 进行测试的系统。我们在 Jmeter 启动测试中遇到以下瓶颈:
症状:
- 我们达到每秒最多 15 个请求 (rps)。
- 此限制是针对每个 Java VM,而不是针对每台计算机。
- CPU 未达到极限,仅在 ca。 30%。该测试与请求一起进行了相当多的预处理和 post 处理,因此这可能是个问题,但事实并非如此。
- 内存(3.5 GiB 的计算机)大约为 . 70% - 80%。这足以提高 rps,因此这不是极限。
- 内存(JVM)已根据建议设置,也进行了多种尝试,但没有改进。
- 我也检查了 TCP 连接,从“使用 keep-alive”到“不使用 keep-alive”的更改没有任何改善(不是预期的)。
- 所有(!)断言都已关闭。
- 日志记录:仅记录响应时间、响应时间百分位数、吞吐量和请求率,以及 jmeter 的标准 table 输出。
- 所有日志文件都保存到本地硬盘。
Jmeter 通过 jmeter.bat 脚本启动,具有以下 JVM 设置:
set HEAP=-Xms768m -Xmx768m -Xss128k
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2
set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000
set PERM=-XX:PermSize=256m -XX:MaxPermSize=256m
set DUMP=-XX:+HeapDumpOnOutOfMemoryError
set DDRAW=
set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %RMIGC% %PERM% %DDRAW% %JM_START% %JM_LAUNCH% %ARGS% %JVM_ARGS% -jar "%JMETER_BIN%ApacheJMeter.jar" %JMETER_CMD_LINE_ARGS%
jmeter.properties有以下内容:
language=en
cookies=cookies
xml.parser=org.apache.xerces.parsers.SAXParser
jmeter.laf.mac=System
jmeter.loggerpanel.maxlength=5000
not_in_menu=HTML Parameter Mask,HTTP User Parameter Modifier
remote_hosts=127.0.0.1
log_level.jmeter=ERROR
log_level.jmeter.junit=ERROR
log_level.jorphan=WARN
log_file='c:\temp\jmeter_'yyyyMMdd'.log'
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss
jmeter.save.saveservice.base_prefix=~/
sampleresult.timestamp.start=true
upgrade_properties=/bin/upgrade.properties
HTTPResponse.parsers=htmlParser wmlParser
htmlParser.types=text/html application/xhtml+xml application/xml text/xml
wmlParser.className=org.apache.jmeter.protocol.http.parser.RegexpHTMLParser
wmlParser.types=text/vnd.wap.wml
summariser.interval=180
summariser.log=true
summariser.out=true
beanshell.server.file=../extras/startup.bsh
time.YMDHMS=yyyyMMdd_HHmmss
onload.expandtree=true
view.results.tree.max_size=0
classfinder.functions.contain=.functions.
classfinder.functions.notContain=.gui.
user.properties=user.properties
system.properties=system.properties
在 jmx
处指定了以下设置:
<stringProp name="ThreadGroup.num_threads">300</stringProp>
<stringProp name="ThreadGroup.ramp_time">0</stringProp>
<stringProp name="ThreadGroup.ramp_time">0</stringProp>
<longProp name="ThreadGroup.start_time">1404986400000</longProp>
<longProp name="ThreadGroup.end_time">1404990000000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration">3600</stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.delayedStart">true</boolProp>
问题: 瓶颈在哪里,如何摆脱?
考虑以下清单:
- 非 GUI 模式是必须
- 全部 监听器需要被禁用
- 如果您使用任何 Beanshell 测试元素 - 安装 groovy 脚本引擎并切换到 JSR223 Sampler 和 groovy 语言
- 有关推荐的 JVM 和 GC 调整,请参阅 JMeter Performance and Tuning Tips 指南
如果以上都没有帮助 - 考虑 remote (distributed) testing
我想提出一些建议,
- 实施 Blazemerter JMeter tips 指定的所有 JMeter 最佳实践(与 Dmitri 提供的 link 相同)这将确保优化脚本。
- 您的计算机有 3.5 GB 或 ram,但您的 JMeter 设置显示,您只提供了最大 768mb 的 JVM 内存。您是否在同一台计算机上启动多个 JMeter 实例?我认为最大堆大小为 2gb 的 JMeter 的单个实例(或为 mmgt 目的创建 2 个实例)应该能够产生 300 个用户负载。
- 虽然测试 运行ning 持续 1 小时,但我看到您的测试的加速时间为 0。对于 300 个用户,所有用户都在 0 秒内上线,这将使系统在开始时过载。真的需要吗?也许您应该增加 10-15 分钟的加速时间和 运行 测试,这将有助于提高 Jmeter 实例的性能。
- 确定您想要生成多少 tps 或 req/sec 如果它出现在您的负载测试计划(或 SLA)中,然后可能使用吞吐量控制器来控制所需的吞吐量。
开始监控 JMeter 实例使用,
JVisualVM : UI 工具,免费软件,很好的细节,易于使用
JMap : UI 和命令行,优秀的细节,易于使用
Jstat : 命令行,系统开销非常低,优秀的细节并监视负载下的应用程序系统以进行更好的分析。 这也将帮助您找到应用程序方面的瓶颈(如果有的话)。
一般普通用户机器也会有 8gb 内存,dual/quad 核心 cpus,因此一台机器可以产生 500-1000 个用户负载。如果需要,请使用分布式 JMeter 测试。