This article is contributed. See the original author and article here.

 


 


By Tejas Shinde


 


JMeter is quite a versatile tool when it comes to Load Testing. Developers can use it to simulate various usage patterns; it also has various plugins that enable it to manipulate these usage patterns.


When we want to simulate the application load by using APIs, we think about targeted throughput. In such scenarios, typically, we want to load the system with specific throughput (requests per second) for a specified duration.


 


In this post, we will take a look at some JMeter plugins that we can use for controlling throughput and ways to use these plugins more efficiently.


 


We will use the following JMeter plugins for this example:



  • Dummy sampler – To simulate request samplers

  • 3 Basic Graphs – To monitor the active threads and transaction rate (throughput)

  • Custom Thread Groups – For Concurrency Thread Group


 


In the following example, we will try to simulate the load of ~20 req/sec. There are various ways you can control the rate at which you can generate the requests; the most commonly used ways are either introducing think time in between the requests or using any of the throughput controllers. The JMX solution can be found at the bottom of this article


 


Every thread group uses the same two samplers that are under the Test Fragment “Request Samples” using the module controllers.


 


For “First Sampler”, response time is set to “${__Random(3000,5000)}” and for “Second Sampler” it is set to “${__Random(5000,10000)}”


 


Throughout this test plan, all the thread groups are set to use 500 threads. And will be executed for ~5 minutes. Typically, the total number of threads needed to achieve a throughput can be calculated by using the following formula Throughput * Avg. Response Time / 1000. To be on the safer side, instead of Avg. Response Time, we use Maximum Response Time in the formula. However, for demo purpose, we are going to use 500 as thread count in the below examples


 


We will discuss the following cases:



  1. Without any throughput controlling measures

  2. With sleep time (Using Constant Timer)

  3. With Constant Throughput Timer

  4. With Throughput Shaping Timer

  5. With Concurrency Thread Group with Throughput Shaping Timer


 


1.png


 


Case 1: Without any throughput controlling measures


 


In this case, no throughput controlling is introduced. This gives us a rough idea about how much throughput we can achieve with 500 threads without having any throughput control.


 


2.png


 


Results:


When we run this thread group, the following are the results of the Aggregate Report:


 


3.png


 


In my case, JMeter was able to generate 81.2 requests/sec. (It may differ in your case based on the various factors)














Throughout the execution, 500 threads were active and sending the requests.



Throughput graph looks consistently distributed



4.png



5.png



 


As we can see, without using any throughput controlling measures, 81.2 req/sec were generated using 500 threads.


 


Case 2: With sleep time (Using Constant Timer)


 


In this case, throughput will be controlled by introducing sleep time in between threads. In this example, a Constant Timer with 15000 milliseconds is used for sleep time. You may need to try it out in a few runs to find the optimum value of sleep time to get the desired throughput.


 


6.png


 


Results:


 


7.png


 














Throughout the execution, 500 threads were active and sending the requests.



As we used sleep times, request generation happens in bursts where throughput will be balanced as a result of sleep times



8.png



9.png



 


Case 3: With Constant Throughput Timer


 


In this scenario, we will use Constant Throughput Timer. This timer will also work similarly to that of Constant Timer. It will pause the threads based on periodically based on the current value of throughput to match up the target throughput value. In this case, an advantage will be sleep time will be calculated automatically based on the target value.


 


10.png


 


*Note that the throughput value is in terms of req/min


 


Results:


 


11.png


 














Throughout the execution, 500 threads were active and sending the requests.



Throughput graph looks very much similar to the graph from the previous case, where we manually paused the threads



12.png



13.png



 


Case 4: With Throughput Shaping Timer


 


In this case, we are using a JMeter plugin – Throughput Shaping timer. This plugin also works similarly to Constant Throughput Timer, which pauses the threads based on the target Throughput. However, a couple of advantages are the request bursts are more consistent in nature, and the samples lie very close to the median value, as can be seen in the throughput graph. Also, this plugin will allow us to simulate various levels of throughput values over a period of time which is not possible in the case of Constant Throughput Timer as it can target only a specific value.


 


14.png


 


Results:


 


15.png


 














Throughout the execution, 500 threads were active and sending the requests.



With Throughput Shaping Timer, the graph looks more consistent, and the sample’s distribution is close to the median value of the throughput, which has been set as a target



16.png



17.png



 


Case 5: With Concurrency Thread Group with Throughput Shaping Timer


 


So far, in all of the previous cases, we have used 500 threads to generate the throughput of 20 req/sec. Depending upon the total number of requests and response time of those requests, it will be quite a calculation to identify the optimum number of thread count that is needed to generate the target output. In cases where the response time is quite low, we will need much less than 500 threads to generate that throughput. And similarly, in situations where response time is high, we may need more than 500 threads to generate the desired throughput.


To calculate the number of threads that are needed to generate the target throughput, we will use another plugin from JMeter in conjunction with Throughput Shaping Timer. Also, to generate the minimum amount of threads, we will use the Schedule Feedback function from JMeter, which will define the number of threads that should be running concurrently to generate the target throughput.


 


Following is the Concurrency Thread Group, which is from the “Custom Thread Groups” plugin. Target concurrency is defined using the feedback function that will work based on the feedback from Throughput Shaping Timer to provide the latest count of threads that are needed to achieve the target of the Throughput Shaping Timer.


 


18.png


 


Feedback function parameters can be explained as follows:



  • ThroughputShapingTimer – Name of the element. In this case, the name of the Throughput Shaping Timer

  • 5 – Number of threads at the start

  • 500 – Maximum allowed threads

  • 10 – Number of spare threads in the pool


 


19.png


 


Results:


 


20.png


 


So as you can see, by using less than 180 threads, we were able to generate a throughput of 19.1 (It’s less than 20 as a result of throughput ramp up and ramp down steps defined in Throughput Shaping Controller).


 














Maximum threads used during this run were less than 180.



Maximum threads used during this run were less than 180.



21.png



22.png



 


Caution:



  • While using the concurrency thread group with Throughput Shaping Timer, makes sure that you specify the sufficient number of threads as if the number is not high, the plugin will show a warning message in the logs stating that there are not enough threads available in the pool to generate the target throughput

  • Similarly, make sure that the specified thread count is not too high as it may result in a spike in throughput at the end of the test (as seen in the above throughput graph) while JMeter is shutting all the threads


 


 


 


Conclusion


Hopefully, this post has helped you learn how to control the throughput in your Load Test project by using the mentioned plugins. Please find references to the plugins and manual from JMeter below. You can also find an attachment containing the scenario that was used to write this article (JMX file).


 


Please leave us any questions or comments too. Thanks for reading!


 


References:



 


Attachment:


 

Brought to you by Dr. Ware, Microsoft Office 365 Silver Partner, Charleston SC.