Jmeter瓶颈

时间:2015-06-16 11:37:40

标签: performance jmeter load-testing

我们正在使用Jmeter测试系统。我们在Jmeter加速测试中遇到以下瓶颈:

症状:

  • 我们每秒最多可达到15个请求(rps)。
  • 此限制是针对每个Java VM,而不是每台计算机。
  • CPU不在极限,只有大约30%。该测试与请求一起进行了一些预处理和后处理,因此这可能是一个问题,但事实并非如此。
  • 内存(3.5 GiB的计算机)大约是70% - 80%。这足以使rps更高一些,所以这不是限制。
  • 内存(JVM)已根据建议进行了设置,并且已经进行了各种实验,但没有任何改进。
  • 我还检查了TCP连接,从“使用keep-alive”到“不使用keep-alive”的改变没有改进任何东西(不是预期的)。
  • 所有(!)断言都已关闭。
  • 记录:仅记录响应时间,响应时间百分位数,吞吐量和请求率,以及jmeter的标准表输出。
  • 所有日志文件都保存到本地硬盘。

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>

问题:     瓶颈在哪里,我们如何摆脱它?

2 个答案:

答案 0 :(得分:4)

我想提出一些建议,

  1. 实施Blazemerter JMeter tips指定的所有JMeter最佳实践(Dmitri提供的相同链接)这将确保脚本得到优化。
  2. 您的计算机有3.5 GB或ram但是您的JMeter设置显示,您只提供了768mb的JVM最大内存。您是否在同一台计算机上启动了多个JMeter实例?我认为具有2gb最大堆大小的JMeter的单个实例(或者用于mmgt目的的2个实例)应该能够产生300个用户负载。
  3. 虽然测试运行了1小时,但我看到测试的加速时间为0。对于300个用户,所有用户都会在0秒内上线,这将使系统在开始时超载。真的需要吗?可能你应该增加一些10-15分钟的时间并运行测试,这将有助于提高Jmeter实例的性能。
  4. 如果负载测试计划(或SLA)中存在tps或req / sec,则确定要生成多少tps或req / sec,然后可能使用吞吐量控制器来控制所需的吞吐量。
  5. 使用

    开始监控JMeter实例

    JVisualVM:UI工具,免费软件,良好的细节,易于使用
     JMap:UI和命令行,优秀的细节,易于使用
     Jstat:命令行,系统开销非常低,细节很好

    并监控负载下的应用系统以便更好地进行分析。 这将有助于您找到应用程序端瓶颈(如果有)。

  6. 一般普通用户机器也将具有8GB内存,双/四核cpu,因此可以从一台机器产生500-1000个用户负载。如果需要,请使用分布式JMeter测试。

答案 1 :(得分:1)

考虑以下清单:

  1. 非GUI模式是必须
  2. 所有需要停用听众
  3. 如果你使用任何Beanshell测试元素 - 安装groovy脚本引擎并切换到JSR223 Sampler和groovy语言
  4. 有关推荐的JVM和GC调整的信息,请参阅JMeter Performance and Tuning Tips指南
  5. 如果以上都无济于事 - 请考虑remote (distributed) testing