【问题标题】:Jmeter test plan is working in local mode (single node) but it not working in distributed modeJmeter 测试计划在本地模式(单节点)下工作,但在分布式模式下不工作
【发布时间】:2019-09-29 09:50:45
【问题描述】:

我在 k8s 上部署了我的 JMeter 设置,带有一个主 pod 和几个从属 pod。如果我尝试在不使用远程实例 (-R) 的情况下运行此测试,则它可以正常工作,但使用远程实例,它会在没有任何执行的情况下完成。我没有收到任何错误。

即使不使用 -R 选项,它也可以在从节点上工作。我尝试了一个从节点,只是为了确保我的从节点能够执行它并且设置没有问题。

jmeter -Jserver.rmi.ssl.disable=true -n -t /tests/jmeter/GGSPerf_testplan.jmx -j jmeter_tests.log
jmeter -Jserver.rmi.ssl.disable=true -n -t /tests/jmeter/GGSPerf_testplan.jmx -j jmeter_tests.log -R 
XX.XX.XX.XX

但是这个测试计划是有效的:https://github.com/kaarolch/kubernetes-jmeter/blob/master/examples/simple_test.jmx

我的 jmeter 测试计划:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.1.1 r1855137">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
  <stringProp name="TestPlan.comments"></stringProp>
  <boolProp name="TestPlan.functional_mode">false</boolProp>
  <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
  <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
  <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
    <collectionProp name="Arguments.arguments"/>
  </elementProp>
  <stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
  <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
    <collectionProp name="HeaderManager.headers">
      <elementProp name="" elementType="Header">
        <stringProp name="Header.name">Content-Type</stringProp>
        <stringProp name="Header.value">text/plain</stringProp>
      </elementProp>
    </collectionProp>
  </HeaderManager>
  <hashTree/>
  <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
    <collectionProp name="Arguments.arguments"/>
  </Arguments>
  <hashTree/>
  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
    <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
    <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
      <boolProp name="LoopController.continue_forever">false</boolProp>
      <stringProp name="LoopController.loops">100</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">8</stringProp>
    <stringProp name="ThreadGroup.ramp_time">4</stringProp>
    <boolProp name="ThreadGroup.scheduler">false</boolProp>
    <stringProp name="ThreadGroup.duration"></stringProp>
    <stringProp name="ThreadGroup.delay"></stringProp>
  </ThreadGroup>
  <hashTree>
    <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
      <collectionProp name="HeaderManager.headers">
        <elementProp name="" elementType="Header">
          <stringProp name="Header.name">Content-Type</stringProp>
          <stringProp name="Header.value">application/json</stringProp>
        </elementProp>
      </collectionProp>
    </HeaderManager>
    <hashTree/>
    <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV Data Set Config" enabled="true">
      <stringProp name="TestPlan.comments">Test configuration</stringProp>
      <stringProp name="filename">${CSVFileName}</stringProp>
      <stringProp name="fileEncoding">${CSVFileEncoding}</stringProp>
      <stringProp name="variableNames">${CSVHeaderVariables}</stringProp>
      <stringProp name="ignoreFirstLine">${CSVIgnoreHeader}</stringProp>
      <stringProp name="delimiter">${CSVDelimeter}</stringProp>
      <stringProp name="quotedData">${CSVAllowQuotedData}</stringProp>
      <stringProp name="recycle">${CSVRecycleOnEOF}</stringProp>
      <stringProp name="stopThread">${CSVStopThreadOnEOF}</stringProp>
      <stringProp name="shareMode">${CSVSharingMode}</stringProp>
    </CSVDataSet>
    <hashTree/>
    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="AddressGeocodeRequest" enabled="true">
      <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
      <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
        <collectionProp name="Arguments.arguments">
          <elementProp name="" elementType="HTTPArgument">
            <boolProp name="HTTPArgument.always_encode">false</boolProp>
            <stringProp name="Argument.value">I have JSON body here</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
        </collectionProp>
      </elementProp>
      <stringProp name="HTTPSampler.domain">${GGS_ServerName}</stringProp>
      <stringProp name="HTTPSampler.port">${GGS_ServerPort}</stringProp>
      <stringProp name="HTTPSampler.protocol"></stringProp>
      <stringProp name="HTTPSampler.contentEncoding"></stringProp>
      <stringProp name="HTTPSampler.path">${GGS_RequestPath}</stringProp>
      <stringProp name="HTTPSampler.method">POST</stringProp>
      <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
      <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
      <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
      <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
      <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
      <stringProp name="HTTPSampler.connect_timeout"></stringProp>
      <stringProp name="HTTPSampler.response_timeout"></stringProp>
    </HTTPSamplerProxy>
    <hashTree/>
    <BackendListener guiclass="BackendListenerGui" testclass="BackendListener" testname="Backend Listener" enabled="true">
      <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
        <collectionProp name="Arguments.arguments">
          <elementProp name="graphiteMetricsSender" elementType="Argument">
            <stringProp name="Argument.name">graphiteMetricsSender</stringProp>
            <stringProp name="Argument.value">org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="graphiteHost" elementType="Argument">
            <stringProp name="Argument.name">graphiteHost</stringProp>
            <stringProp name="Argument.value">test-influxdb</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="graphitePort" elementType="Argument">
            <stringProp name="Argument.name">graphitePort</stringProp>
            <stringProp name="Argument.value">2003</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="rootMetricsPrefix" elementType="Argument">
            <stringProp name="Argument.name">rootMetricsPrefix</stringProp>
            <stringProp name="Argument.value">jmeter.</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="summaryOnly" elementType="Argument">
            <stringProp name="Argument.name">summaryOnly</stringProp>
            <stringProp name="Argument.value">true</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="samplersList" elementType="Argument">
            <stringProp name="Argument.name">samplersList</stringProp>
            <stringProp name="Argument.value"></stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
          <elementProp name="percentiles" elementType="Argument">
            <stringProp name="Argument.name">percentiles</stringProp>
            <stringProp name="Argument.value">90;95;99</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
        </collectionProp>
      </elementProp>
      <stringProp name="classname">org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient</stringProp>
    </BackendListener>
    <hashTree/>
  </hashTree>
</hashTree>

Logs 中没有任何用处,没有错误或堆栈跟踪:

2019-09-30 10:37:36,873 INFO o.a.j.r.RmiUtils: Disabling SSL for RMI as 
server.rmi.ssl.disable is set to 'true'
2019-09-30 10:37:37,294 INFO o.a.j.e.ClientJMeterEngine: sent test to 
10.56.0.27 basedir='tmp'
2019-09-30 10:37:37,294 INFO o.a.j.e.ClientJMeterEngine: Sending properties 
{}
2019-09-30 10:37:37,315 INFO o.a.j.e.ClientJMeterEngine: sent run command to 
10.56.0.27
2019-09-30 10:37:37,315 INFO o.a.j.e.DistributedRunner: Remote engines have 
been started
2019-09-30 10:37:38,055 INFO o.a.j.JMeter: Started remote host:  10.56.0.26 
(1569839858055)
2019-09-30 10:37:38,254 INFO o.a.j.r.Summariser: summary =      0 in 
00:00:00 = ******/s Avg:     0 Min: 9223372036854775807 Max: 
-9223372036854775808 Err:     0 (0.00%)
2019-09-30 10:37:38,255 INFO o.a.j.JMeter: Finished remote host: 10.56.0.26 
(1569839858255)
2019-09-30 10:37:38,613 INFO o.a.j.JMeter: Started remote host:  10.56.0.27 
(1569839858613)
2019-09-30 10:37:38,706 INFO o.a.j.r.Summariser: summary =      0 in 
00:00:00 = ******/s Avg:     0 Min: 9223372036854775807 Max: 
-9223372036854775808 Err:     0 (0.00%)
2019-09-30 10:37:38,707 INFO o.a.j.JMeter: Finished remote host: 10.56.0.27 
(1569839858707)
2019-09-30 10:37:43,260 INFO o.a.j.JMeter: Interrupting RMI Reaper

【问题讨论】:

  • 你是否在 slaves 中运行了 jmeter-server
  • @Adnan 感谢您的及时回复。是的,JMeter-server 正在从节点上运行。
  • 你能分享 JMeter 日志吗?
  • @Adnan,我添加了日志。

标签: kubernetes jmeter performance-testing jmeter-plugins jmeter-5.0


【解决方案1】:

我可以看到至少一个失败的原因:您的测试计划不是valid XML file,因为它在底部缺少这两行:

    </hashTree>
</jmeterTestPlan>

此外,如果您在主设备端禁用安全 RMI,您应该对所有从设备执行相同操作:

jmeter-server -Jserver.rmi.ssl.disable=true

最后,注意 JMeter slave 的 IP 地址,当你启动 JMeter slave 时,你应该会看到如下内容:

创建的远程对象:UnicastServerRef2 [liveRef: [endpoint:XX.XX.XX.XX:1794,objID:[38be521f:16d80bfab94:-7fff, 2395028286451043349]]]

如果 IP 地址不是您所期望的,即运行 JMeter slave 的机器有多个网络接口,您可以通过 java.rmi.server.hostname 属性明确指定要绑定的一个,例如:

jmeter-server -Jserver.rmi.ssl.disable=true -Djava.rmi.server.hostname=XX.XX.XX.XX

更多信息:

【讨论】:

  • 感谢@Dmitri 的投入。我发现了问题。我使用“-q”选项来提供我的属性文件,但似乎 jmeter 没有广播这个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2014-12-09
  • 2023-01-11
相关资源
最近更新 更多