1

Я запускаю тесты, в которых 250 одновременных вызовов постоянно отправляются из JMeter 3.1 в рабочий процесс приложения Mule, и результаты начинаются с хороших результатов, но внезапно начинают всплывать от 20 миллисекунд до 6 секунд или более ,Тестирование спайков в Mule, влияющих на результаты производительности

Я прочитал этот документ: https://docs.mulesoft.com/mule-user-guide/v/3.8/tuning-performance и попытался изменить максимальные активные потоки с 16 по 300 по умолчанию, поэтому каждая транзакция будет иметь свой собственный поток, но всплески все равно будут возникать.

Я создал тестовый поток, в котором есть HTTP-прослушиватель и компонент Set Payload, который устанавливает полезную нагрузку в массив JSON из 200 элементов, и снова результаты хороши в начале, но затем начинают пикировать.

Есть ли что-нибудь еще, что я мог бы рассмотреть, что может вызвать всплески?

Я использую Anypoint Studio 6.1 и Mule 3.8.1 и тестирование с использованием Apache JMeter 3.1.

HTTP Listener:

enter image description here

Test XML Flow:

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" 
    xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:mongo="http://www.mulesoft.org/schema/mule/mongo" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/mongo http://www.mulesoft.org/schema/mule/mongo/current/mule-mongo.xsd 
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd 
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd"> 
    <flow name="testFlow"> 
     <http:listener config-ref="HTTP_Listener_Configuration" path="/perf-test" allowedMethods="GET" doc:name="HTTP"/> 
     <set-payload value="[{ 
    &quot;id&quot;: &quot;0001&quot;, 
    &quot;type&quot;: &quot;donut&quot;, 
    &quot;name&quot;: &quot;Cake&quot;, 
    &quot;ppu&quot;: 0.55, 
    &quot;batters&quot;: { 
     &quot;batter&quot;: [{ 
      &quot;id&quot;: &quot;1001&quot;, 
      &quot;type&quot;: &quot;Regular&quot; 
     }, { 
     &quot;id&quot;: &quot;5004&quot;, 
     &quot;type&quot;: &quot;Maple&quot; 
    } ...repeated for 10,000 lines 
    ] 
}]" encoding="UTF-8" mimeType="application/json" doc:name="Set Payload"/> 
    </flow> 
</mule> 

План тестирования JMeter:

<?xml version="1.0" encoding="UTF-8"?> 
<jmeterTestPlan version="1.2" properties="3.1" jmeter="3.1 r1770033"> 
    <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.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> 
     <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test" 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> 
      <intProp name="LoopController.loops">-1</intProp> 
     </elementProp> 
     <stringProp name="ThreadGroup.num_threads">250</stringProp> 
     <stringProp name="ThreadGroup.ramp_time">10</stringProp> 
     <longProp name="ThreadGroup.start_time">1486993535000</longProp> 
     <longProp name="ThreadGroup.end_time">1486993535000</longProp> 
     <boolProp name="ThreadGroup.scheduler">false</boolProp> 
     <stringProp name="ThreadGroup.duration">60</stringProp> 
     <stringProp name="ThreadGroup.delay"></stringProp> 
     </ThreadGroup> 
     <hashTree> 
     <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"> 
      <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> 
      <collectionProp name="Arguments.arguments"/> 
      </elementProp> 
      <stringProp name="HTTPSampler.domain">localhost</stringProp> 
      <stringProp name="HTTPSampler.port">8091</stringProp> 
      <stringProp name="HTTPSampler.connect_timeout"></stringProp> 
      <stringProp name="HTTPSampler.response_timeout"></stringProp> 
      <stringProp name="HTTPSampler.protocol">http</stringProp> 
      <stringProp name="HTTPSampler.contentEncoding"></stringProp> 
      <stringProp name="HTTPSampler.path"></stringProp> 
      <stringProp name="HTTPSampler.concurrentPool">4</stringProp> 
     </ConfigTestElement> 
     <hashTree/> 
     <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Test1" enabled="true"> 
      <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> 
      <collectionProp name="Arguments.arguments"/> 
      </elementProp> 
      <stringProp name="HTTPSampler.domain"></stringProp> 
      <stringProp name="HTTPSampler.port"></stringProp> 
      <stringProp name="HTTPSampler.connect_timeout"></stringProp> 
      <stringProp name="HTTPSampler.response_timeout"></stringProp> 
      <stringProp name="HTTPSampler.protocol"></stringProp> 
      <stringProp name="HTTPSampler.contentEncoding"></stringProp> 
      <stringProp name="HTTPSampler.path">/v1/perf-test</stringProp> 
      <stringProp name="HTTPSampler.method">GET</stringProp> 
      <boolProp name="HTTPSampler.follow_redirects">false</boolProp> 
      <boolProp name="HTTPSampler.auto_redirects">true</boolProp> 
      <boolProp name="HTTPSampler.use_keepalive">true</boolProp> 
      <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> 
      <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp> 
      <boolProp name="HTTPSampler.monitor">false</boolProp> 
      <stringProp name="HTTPSampler.embedded_url_re"></stringProp> 
     </HTTPSamplerProxy> 
     <hashTree> 
      <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> 
      <collectionProp name="Asserion.test_strings"> 
       <stringProp name="-456173320">Test</stringProp> 
      </collectionProp> 
      <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> 
      <boolProp name="Assertion.assume_success">false</boolProp> 
      <intProp name="Assertion.test_type">2</intProp> 
      </ResponseAssertion> 
      <hashTree/> 
     </hashTree> 
     <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>true</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
       <url>true</url> 
       <threadCounts>true</threadCounts> 
       <sampleCount>true</sampleCount> 
       <idleTime>true</idleTime> 
       <connectTime>true</connectTime> 
      </value> 
      </objProp> 
      <stringProp name="filename">tmp/Results/summary.csv</stringProp> 
      <boolProp name="useGroupName">true</boolProp> 
     </ResultCollector> 
     <hashTree/> 
     <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>true</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
       <url>true</url> 
       <threadCounts>true</threadCounts> 
       <sampleCount>true</sampleCount> 
       <idleTime>true</idleTime> 
       <connectTime>true</connectTime> 
      </value> 
      </objProp> 
      <stringProp name="filename">tmp/AggregateReport.csv</stringProp> 
      <boolProp name="useGroupName">true</boolProp> 
     </ResultCollector> 
     <hashTree/> 
     <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true"> 
      <stringProp name="ConstantTimer.delay">1000</stringProp> 
     </ConstantTimer> 
     <hashTree/> 
     <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>false</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
       <threadCounts>true</threadCounts> 
      </value> 
      </objProp> 
      <stringProp name="filename"></stringProp> 
     </ResultCollector> 
     <hashTree/> 
     </hashTree> 
    </hashTree> 
    </hashTree> 
</jmeterTestPlan> 

Сводные результаты:

Ниже приводится краткое изложение результатов для тестового XML, где он последовательно в двузначных числах, прежде чем внезапно приняты почти в 3 раза дольше, чтобы завершить запрос, прежде чем вернуться к нормальной жизни снова (это происходит на в ряде случаев, как он проходит через вызовы)

enter image description here

Благодаря

+0

Как вы Построив JSONArray в пределах HTTP Sampler? Можете ли вы опубликовать древовидную структуру вашего плана тестирования и где хранится ваш код для создания JSONObject? – Selva

+0

Добавлен файл JMeter и итоговое резюме резюме, XML-тестовый поток и конфигурация коннектора HTTP – user3165854

+0

Я согласен с ответом Димитрия ниже. Поскольку вы используете тест с одного и того же компьютера, вы можете столкнуться с проблемами ресурсов. Учитывая огромную разницу между прошедшим временем vs {connect + latency}, это говорит о том, что у вас есть проблемы с подключением к locahost. – Selva

ответ

1

Глядя в Connect и Latency, высокое время отклика коррелирует с высоким уровнем соединения и латентностью, поэтому я ожидаю, что вы получаете эти «спайки» из-за проблем с сетью.

Ссылка:

  • JMeter Glossary - метрики JMeter объяснили
  • How to Analyze the Results of a Load Test - социологическое исследование реальной жизни, где высокая латентность была причиной плохой работы