Search code examples
jmeterjmeter-plugins

Running two Ultimate Thread Groups consecutively


Listed below is a .jmx file that contains a test plan with two Ultimate Thread Groups, both with one transactions per second listener and one sampler and both of those samplers with a throughput shaping timer.

The test plan is set to run all thread groups consecutively, but when I run the test plan, only the first UTG runs. When I disable the first one, the second one does run. When I set the test plan to run the UTGs in parallel, they both run fine.

Do UTGs not support running consecutively? Am I doing something wrong?

<?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">
      <stringProp name="TestPlan.comments">This example test plan demonstrates 
how Throughput Shaping Timer is used
to limit Requests per Second 
to desired shape.</stringProp>
      <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
    </TestPlan>
    <hashTree>
      <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group">
        <collectionProp name="ultimatethreadgroupdata">
          <collectionProp name="-167714363">
            <stringProp name="1691">50</stringProp>
            <stringProp name="0">0</stringProp>
            <stringProp name="48">0</stringProp>
            <stringProp name="1572">15</stringProp>
            <stringProp name="53">5</stringProp>
          </collectionProp>
        </collectionProp>
        <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>
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
      </kg.apc.jmeter.threads.UltimateThreadGroup>
      <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="SUCCESFULL">true</boolProp>
          <stringProp name="RESPONSE_CODE">200</stringProp>
          <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
          <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
without actual network activity. This helps debugging tests.</stringProp>
          <stringProp name="RESPONSE_TIME">${__Random(1,10)}</stringProp>
          <stringProp name="TestPlan.comments">Pretty fast response time gives us huge possible RPS rate</stringProp>
          <boolProp name="WAITING">false</boolProp>
          <stringProp name="REQUEST_DATA"></stringProp>
          <stringProp name="LATENCY"></stringProp>
          <stringProp name="CONNECT"></stringProp>
          <stringProp name="URL"></stringProp>
          <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
        </kg.apc.jmeter.samplers.DummySampler>
        <hashTree>
          <kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer">
            <collectionProp name="load_profile">
              <collectionProp name="1914237040">
                <stringProp name="49">1</stringProp>
                <stringProp name="1000">1000</stringProp>
                <stringProp name="1567">10</stringProp>
              </collectionProp>
              <collectionProp name="394057850">
                <stringProp name="1507423">1000</stringProp>
                <stringProp name="49">1</stringProp>
                <stringProp name="53">5</stringProp>
              </collectionProp>
            </collectionProp>
            <stringProp name="TestPlan.comments">Table below sets request rate shcedule ant preview graph instantly shows effect of changes.</stringProp>
          </kg.apc.jmeter.timers.VariableThroughputTimer>
          <hashTree/>
        </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/>
      </hashTree>
      <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group">
        <collectionProp name="ultimatethreadgroupdata">
          <collectionProp name="-167631597">
            <stringProp name="1691">50</stringProp>
            <stringProp name="0">0</stringProp>
            <stringProp name="48">0</stringProp>
            <stringProp name="1572">15</stringProp>
            <stringProp name="10">10</stringProp>
          </collectionProp>
        </collectionProp>
        <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>
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
      </kg.apc.jmeter.threads.UltimateThreadGroup>
      <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="SUCCESFULL">true</boolProp>
          <stringProp name="RESPONSE_CODE">200</stringProp>
          <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
          <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
without actual network activity. This helps debugging tests.</stringProp>
          <stringProp name="RESPONSE_TIME">${__Random(1,10)}</stringProp>
          <stringProp name="TestPlan.comments">Pretty fast response time gives us huge possible RPS rate</stringProp>
          <boolProp name="WAITING">false</boolProp>
          <stringProp name="REQUEST_DATA"></stringProp>
          <stringProp name="LATENCY"></stringProp>
          <stringProp name="CONNECT"></stringProp>
          <stringProp name="URL"></stringProp>
          <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
        </kg.apc.jmeter.samplers.DummySampler>
        <hashTree>
          <kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer">
            <collectionProp name="load_profile">
              <collectionProp name="-136768949">
                <stringProp name="49">1</stringProp>
                <stringProp name="1537214">2000</stringProp>
                <stringProp name="1567">10</stringProp>
              </collectionProp>
              <collectionProp name="81940520">
                <stringProp name="1537214">2000</stringProp>
                <stringProp name="49">1</stringProp>
                <stringProp name="53">5</stringProp>
              </collectionProp>
            </collectionProp>
            <stringProp name="TestPlan.comments">Table below sets request rate shcedule ant preview graph instantly shows effect of changes.</stringProp>
          </kg.apc.jmeter.timers.VariableThroughputTimer>
          <hashTree/>
        </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>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>
          <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/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

Solution

  • This version of test plan

    <?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">
          <stringProp name="TestPlan.comments">This example test plan demonstrates 
    how Throughput Shaping Timer is used
    to limit Requests per Second 
    to desired shape.</stringProp>
          <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
          <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
        </TestPlan>
        <hashTree>
          <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group">
            <collectionProp name="ultimatethreadgroupdata">
              <collectionProp name="903268531">
                <stringProp name="49">1</stringProp>
                <stringProp name="0">0</stringProp>
                <stringProp name="48">0</stringProp>
                <stringProp name="49">1</stringProp>
                <stringProp name="48">0</stringProp>
              </collectionProp>
            </collectionProp>
            <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>
            <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
          </kg.apc.jmeter.threads.UltimateThreadGroup>
          <hashTree>
            <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="UTG 1">
              <boolProp name="SUCCESFULL">true</boolProp>
              <stringProp name="RESPONSE_CODE">200</stringProp>
              <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
              <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
              <stringProp name="RESPONSE_TIME">${__Random(1,10)}</stringProp>
              <stringProp name="TestPlan.comments">Pretty fast response time gives us huge possible RPS rate</stringProp>
              <boolProp name="WAITING">false</boolProp>
              <stringProp name="REQUEST_DATA"></stringProp>
              <stringProp name="LATENCY"></stringProp>
              <stringProp name="CONNECT"></stringProp>
              <stringProp name="URL"></stringProp>
              <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
            </kg.apc.jmeter.samplers.DummySampler>
            <hashTree>
              <kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer" enabled="true">
                <collectionProp name="load_profile">
                  <collectionProp name="1914237040">
                    <stringProp name="49">1</stringProp>
                    <stringProp name="1000">1000</stringProp>
                    <stringProp name="1567">10</stringProp>
                  </collectionProp>
                  <collectionProp name="394057850">
                    <stringProp name="1507423">1000</stringProp>
                    <stringProp name="49">1</stringProp>
                    <stringProp name="53">5</stringProp>
                  </collectionProp>
                </collectionProp>
                <stringProp name="TestPlan.comments">Table below sets request rate shcedule ant preview graph instantly shows effect of changes.</stringProp>
              </kg.apc.jmeter.timers.VariableThroughputTimer>
              <hashTree/>
            </hashTree>
            <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.TransactionsPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="jp@gc - Transactions per Second" 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>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/>
          </hashTree>
          <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group">
            <collectionProp name="ultimatethreadgroupdata">
              <collectionProp name="2119874544">
                <stringProp name="49">1</stringProp>
                <stringProp name="0">0</stringProp>
                <stringProp name="48">0</stringProp>
                <stringProp name="49">1</stringProp>
                <stringProp name="48">0</stringProp>
              </collectionProp>
            </collectionProp>
            <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>
            <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
          </kg.apc.jmeter.threads.UltimateThreadGroup>
          <hashTree>
            <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="UTG2">
              <boolProp name="SUCCESFULL">true</boolProp>
              <stringProp name="RESPONSE_CODE">200</stringProp>
              <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
              <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
              <stringProp name="RESPONSE_TIME">${__Random(1,10)}</stringProp>
              <stringProp name="TestPlan.comments">Pretty fast response time gives us huge possible RPS rate</stringProp>
              <boolProp name="WAITING">false</boolProp>
              <stringProp name="REQUEST_DATA"></stringProp>
              <stringProp name="LATENCY"></stringProp>
              <stringProp name="CONNECT"></stringProp>
              <stringProp name="URL"></stringProp>
              <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
            </kg.apc.jmeter.samplers.DummySampler>
            <hashTree>
              <kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer" enabled="true">
                <collectionProp name="load_profile">
                  <collectionProp name="-136768949">
                    <stringProp name="49">1</stringProp>
                    <stringProp name="1537214">2000</stringProp>
                    <stringProp name="1567">10</stringProp>
                  </collectionProp>
                  <collectionProp name="81940520">
                    <stringProp name="1537214">2000</stringProp>
                    <stringProp name="49">1</stringProp>
                    <stringProp name="53">5</stringProp>
                  </collectionProp>
                </collectionProp>
                <stringProp name="TestPlan.comments">Table below sets request rate shcedule ant preview graph instantly shows effect of changes.</stringProp>
              </kg.apc.jmeter.timers.VariableThroughputTimer>
              <hashTree/>
            </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>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>
              <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/>
          </hashTree>
          <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree">
            <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>
    </jmeterTestPlan>
    

    results in

    enter image description here

    But there is a problem with other configurations you should report it to the plugin developers/maintainers via JMeter Plugins Support Forum

    In general I wouldn't recommend using Test Plan for Ultimate Thread Groups scheduling, go for "Initial Delay" instead:

    enter image description here

    also looking into jmeter.log file:

    VariableThroughputTimer: No free threads available in current Thread Group jp@gc - Ultimate Thread Group, made 0 samples/s for expected rps 1.0 samples/s, increase your number of threads
    

    and

    2024-05-29 13:31:42,000 INFO k.a.j.t.VariableThroughputTimer: No further RPS schedule, asking threads to stop...
    2024-05-29 13:31:42,000 INFO k.a.j.t.VariableThroughputTimer: Tries more than 5, shutting down engine!
    2024-05-29 13:31:42,000 INFO o.a.j.t.JMeterThread: Stopping because end time detected by thread: jp@gc - Ultimate Thread Group 1-31
    

    it looks like Throughput Shaping Timer is causing the trouble rather than Ultimate Thread Group

    Also consider switching to Concurrency Thread Group, it can be connected with the Throughput Shaping Timer via Feedback Function