- Вопрос или проблема
- Ответ или решение
- Почему таймер постоянной пропускной способности JMeter не достигает желаемого TPS
- 1. Конфигурация таймера
- Рекомендации:
- 2. Исходное время и нагрузка
- Рекомендации:
- 3. Запуск нескольких потоков
- Рекомендации:
- 4. Логи и отчетность
- Рекомендации:
- 5. Настройки окружения
- Рекомендации:
- Заключение
Вопрос или проблема
У меня есть план тестирования JMeter с пустым образцом и добавленным таймером постоянной пропускной способности в качестве дочернего элемента. Я хочу достичь цели в 10 TPS, поэтому установил пропускную способность на 600 образцов в минуту, пользователей – 10. Однако после запуска теста я ожидал, что он достигнет 10 TPS, но он не выполняется так, как ожидалось. Может кто-то помочь мне понять, что я мог сделать не так?
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">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>
</TestPlan>
<hashTree>
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables">
<collectionProp name="Arguments.arguments">
<elementProp name="TPM_TO_ACHIEVE" elementType="Argument">
<stringProp name="Argument.name">TPM_TO_ACHIEVE</stringProp>
<stringProp name="Argument.value">${__P(TPM_TO_ACHIEVE,600.0)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="TOTALDURATION" elementType="Argument">
<stringProp name="Argument.name">TOTALDURATION</stringProp>
<stringProp name="Argument.value">${__P(sz_duration,60)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="API_Invoked" elementType="Argument">
<stringProp name="Argument.name">API_Invoked</stringProp>
<stringProp name="Argument.value">true</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</Arguments>
<hashTree/>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group">
<intProp name="ThreadGroup.num_threads">10</intProp>
<intProp name="ThreadGroup.ramp_time">10</intProp>
<stringProp name="ThreadGroup.duration">${TOTALDURATION}</stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller">
<intProp name="LoopController.loops">-1</intProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
</ThreadGroup>
<hashTree>
<IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller">
<boolProp name="IfController.evaluateAll">false</boolProp>
<boolProp name="IfController.useExpression">false</boolProp>
<stringProp name="IfController.condition">"${API_Invoked}"=="true"</stringProp>
</IfController>
<hashTree>
<kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="jp@gc - Dummy Sampler">
<boolProp name="WAITING">true</boolProp>
<boolProp name="SUCCESFULL">true</boolProp>
<stringProp name="RESPONSE_CODE">200</stringProp>
<stringProp name="RESPONSE_MESSAGE">OK</stringProp>
<stringProp name="REQUEST_DATA">Пустой образец, использующийся для симуляции запросов и ответов без фактической сетевой активности. Это помогает в отладке тестов.</stringProp>
<stringProp name="RESPONSE_DATA">Пустой образец, использующийся для симуляции запросов и ответов без фактической сетевой активности. Это помогает в отладке тестов.</stringProp>
<stringProp name="RESPONSE_TIME">${__Random(50,500)}</stringProp>
<stringProp name="LATENCY">${__Random(1,50)}</stringProp>
<stringProp name="CONNECT">${__Random(1,5)}</stringProp>
<stringProp name="URL"></stringProp>
<stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
</kg.apc.jmeter.samplers.DummySampler>
<hashTree>
<ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer">
<stringProp name="throughput">${TPM_TO_ACHIEVE}</stringProp>
<intProp name="calcMode">2</intProp>
</ConstantThroughputTimer>
<hashTree/>
</hashTree>
</hashTree>
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree">
<boolProp name="ResultCollector.error_logging">true</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>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
<kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.TransactionsPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="jp@gc - Transactions per Second">
<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>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
<longProp name="interval_grouping">1000</longProp>
<boolProp name="graph_aggregated">false</boolProp>
<stringProp name="include_sample_labels"></stringProp>
<stringProp name="exclude_sample_labels"></stringProp>
<stringProp name="start_offset"></stringProp>
<stringProp name="end_offset"></stringProp>
<boolProp name="include_checkbox_state">false</boolProp>
<boolProp name="exclude_checkbox_state">false</boolProp>
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
<hashTree/>
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report">
<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>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
Ответ или решение
Почему таймер постоянной пропускной способности JMeter не достигает желаемого TPS
Когда вы сталкиваетесь с проблемой, что таймер постоянной пропускной способности (Constant Throughput Timer) в JMeter не достигает заданного уровня транзакций в секунду (TPS), важно тщательно проанализировать конфигурацию вашего тестового плана. Ваша ситуация включает в себя некоторые ключевые аспекты, которые могут повлиять на производительность теста.
1. Конфигурация таймера
Вы установили целевую пропускную способность на 600 образцов в минуту (или 10 TPS) и задали 10 пользователей в группе потоков. Так как Constant Throughput Timer контролирует общее количество запросов за единицу времени (в данном случае за минуту), имеет значение, правильно ли вы настроили параметры выполнения теста.
Рекомендации:
- Убедитесь, что значение в поле "throughput" таймера задано как
${TPM_TO_ACHIEVE}
, что правильно, так как переменной присваивается значение 600. - Убедитесь, что параметр
calcMode
установлен в значение 2, которое означает, что таймер будет управлять частотой запросов на уровне пользователя.
2. Исходное время и нагрузка
Время нажатия на кнопку заставляет таймер работать так, чтобы обеспечить стабильную пропускную способность. В вашем случае используете WAITING
в параметрах Dummy Sampler, который влияет на время, необходимое на обработку каждого запроса. Исходя из поставленной вами задачи, возможно, потребуется рассмотреть влияние времени ожидания на итоговые результаты.
Рекомендации:
- Убедитесь, что время ответа на запросы (RESPONSE_TIME) устанавливается так, чтобы оно не превышало времени, необходимого для достижения вашей целевой пропускной способности.
- Программа JMeter моделирует работу потоков с учетом времени ожидания, поэтому, если ваше ожидаемое время ответа часто будет больше, чем время, заданное в таймере, достигнуть 10 TPS будет проблематично.
3. Запуск нескольких потоков
К сожалению, просто введя 10 потоков, вы можете не получить желаемую пропускную способность из-за настроек и характеристик вашей среды тестирования. Ваша система, или сервер, на который направлены запросы, также может быть узким местом.
Рекомендации:
- Проверьте, может ли ваша тестируемая система обрабатывать нагрузку, основываясь на пропускной способности и откликах. Наличие большого числа потоков не всегда означает, что система справится с большим объемом поступающих запросов.
- Оптимизируйте серверные настройки, если они влияют на обработку.
4. Логи и отчетность
Логи и результаты теста могут предоставить ценную информацию о том, почему не удается достичь цели TPS. Обратите внимание на ошибки, время ожидания и любые другие исключения, которые могли быть зарегистрированы.
Рекомендации:
- Используйте различные визуализаторы (например, "View Results Tree" и "Aggregate Report"), чтобы проанализировать поведение системы и убедиться, что запросы успешно выполняются.
- Убедитесь, что логирование ошибок (error_logging) включено, чтобы отслеживать любые сбои во время тестирования.
5. Настройки окружения
Некоторые элементы окружения могут непосредственно влиять на результаты вашего тестирования. Параметры системы, такие как доступная пропускная способность сети, конфигурации серверов или другие внешние факторы, должны также учитываться.
Рекомендации:
- Убедитесь, что тестирование проходит в контролируемой и стабильной среде, без внешних факторов, таких как медленное сетевое подключение или высокие нагрузки на сервере.
Заключение
Важно понимать, что наличие правильно настроенного тестового плана в JMeter – это только половина дела. Необходимо внимательно следить за пропускной способностью, временем ожидания и способностями вашей системы обрабатывать нагрузку. Следуя вышеприведённым рекомендациям, вы сможете оптимизировать работу вашего теста и, в конечном итоге, достичь желаемого уровня TPS.
Если у вас появятся дополнительные вопросы или потребуется помощь в процессе настройки, не стесняйтесь обращаться за поддержкой на специализированные сообщества или к коллегам, чтобы получить наиболее полные и точные рекомендации.