January 24, 2018

How to Use the Parallel Controller in JMeter

Open Source Automation

In this article we are going to analyze one of Apache JMeter™’s extensions - the Parallel Controller. This controller was developed by BlazeMeter as a contribution to the open source community, by Andrey Pokhilko and Artem Fedorov.

 

Back to top

What is the Parallel Controller?

The Parallel Controller can be used to create parallel requests. Parallel requests are requests that are not executed one after the other, but simultaneously. For example, to handle AJAX requests or perform other simultaneous actions in a load script.

 

You can install the Parallel Controller by using the JMeter Plugins Manager. It is called the Parallel Controller & Sampler. We will also need a Dummy Sampler and a WebSocket plugin for this demonstration, which you can find in the JMeter Plugins Manager as well. We will use Websocket Samplers by Peter Doornbosch.

Now we will look at the Parallel Controller’s features through several examples. Let's start with a simple example.

📕 Related Content: The Essential Guide to Parallel Testing

Back to top

Using the Parallel Controller - A Simple Example

 

1. First, let’s add the controller to the Test Plan. After adding a thread group:

Right click on Thread Group -> Add -> Logic Controller -> bzm - Parallel Controller

2. Also add two Dummy Samplers inside the controller and apply identical characteristics to both of them.

Right click on the Parallel Controller -> Add -> Samplers  -> jp@gc Dummy Sampler

The samplers are needed to emulate sending HTTP requests. You can add any Samplers according to your need. Now the script looks like this:

load testing with the parallel controller

3. Run the test.

open source load testin parallel requests

As you can see from the screenshot above, the Start Time for both requests is identical. This means the requests were sent simultaneously.

First important note: If you open the console, you will see that the number of running threads has become equal to two. That is, this controller creates two threads and runs them simultaneously.

how to use jmeter's parallel controller

Back to top

Using the Parallel Controller - with Multiple Elements

 

If you have several samplers that need to work in one thread, you need to logically combine them. Otherwise, the parallel controller creates new threads for each of its child elements.

4. For example, you can use a Simple Controller. To add it:

Right click on Thread Group -> Add -> Logic Controller -> Simple Controller

Now, put the elements that should be combined under this controller.

performance testing parallel requests

Now the Parallel Controller will create 2 threads: the first for Dummy 1 and Dummy 2 (under the first Simple Controller) and the second for Dummy 3 and Dummy 4 (under the second Simple Controller). Besides, we added Dummy 5 after the Parallel Controller and it will be executed after these two groups finished executing.

jmeter, parallel controller

As you can see in the GIF above, Dummy 1 and 2 have different starting times, and Dummy 5 was only executed after Dummy 4 execution.

Second important note: The next part of the test will not start until all the parallel threads have completed their work.

Now let's take a look at the two notes I highlighted, their downside and possible solutions.

 

Back to top

Running Threads Simultaneously - The Problem

 

The first note is that the controller creates separate threads and executes them in parallel. Because of this, there might be a problem with samplers that interact with each other inside the thread.

For demonstration, we will use the WebSocket plugin. This plugin has a group of samplers that can be connected by the WebSocket session inside the thread.

guide to parallel controller in jmeter

If the session is created before a Parallel controller, and the work of sampler’s group is performed inside the controller, we will get an error. The error states that the connection does not exist from the WS Sampler (that is located inside the controller). You can see this in the screenshot below.

 

Back to top

Running Threads Simultaneously - The Solution

 

If you have related elements in the test plan, they should all be placed inside the Parallel Controller.

 

jmeter plugins, parallel controller, how to use

 

Back to top

Running All Parallel Controller Elements Before Moving On in the Test - The Problem

 

The second note is that the next part of the test will not start until all parallel threads have completed their work.

 

I once had the following scenario: a user got a large amount of data via a HTTP request and received information via a web socket for a certain time. When the time ran out, the scenario stated that he should go to the next page.

 

This part of the test was as follows. In the test, the page to go to after time runs out is called “Last request”.

 

test case for jmeter's parallel controller

 

The problem was that when time ran out, the thread that received the messages did quit, but the thread that received the data didn’t finish running until it received all the data.

 

So, the thread will not go on to the next step until the data finishes loading. But this behavior is wrong. That is, it is necessary to somehow interrupt the execution of the second thread after the parallel thread completes.

 

Back to top

Running All Parallel Controller Elements Before Moving On in the Test - The Solution

 

Some samplers have a Timeout field. In my case, I used the HTTP request sampler and it has a Connection Timeout Field. This means that after the specified time the sampler will finish its work. But this solution is too narrow.

Another solution could be as follows. Let’s say you have a different case, and in both threads, you have a group of requests that are executed in a loop. One thread finishes after receiving a certain message, and the second does not know about this message. The second should finish after the last iteration, and you can use the Groovy or BeanShell samplers to do that by setting the necessary value of the variable. For instance, using the vars.put("isEnd","true") command variable and ‘isEnd’ gets a ‘true’ value.

This situation will look like this:

parallel controller in jmeter

Here we have two parallel threads: the first thread with the While controller and the second thread with the Loop controller (this controller replaces the message receiving). Inside the second thread, after the Loop controller, you set the value using the Groovy or BeanShell sampler. In the first thread, you check the value of this variable in the While controller’s condition, for example, using the following condition:  ${__jexl3("${isEnd}"=="true")}.

 

Back to top

Don’t Run a Parallel Controller in a Parallel Controller

 

There is also a problem that cannot be solved: you cannot add a parallel controller inside the parallel controller. An error will be received when executing. Just don’t do that.

parallel requests, jmeter, ajax requests

 

Back to top

The Parallel Sampler

 

The Parallel Sampler is a light version of the controller, and is used to create Ajax requests or others parallel HTTP requests. The sampler has a simple interface and it is presented in the screenshot below. You just need to put in all parallel URLs.

jmeter load testing ajax requests

The sampler will not finish execution until all references are processed. But if you want to use it for paralleling site pages, remember that the sampler executes all the links that are on the website page as well.

executing parallel requests in a load test

To sum up, the Parallel Controller is a good controller for requests paralleling, which is very useful for testing sites with parallel actions. For instance, when processing WebSocket requests, or for testing mobile applications, where there can be a huge number of parallel requests like heartbeat requests. In addition to the controller, we also have the Parallel Sampler that can used for creating parallel HTTP requests, which greatly facilitates the structure of the script and is well suited for paralleling Ajax requests.

That’s it! If you want to learn more advanced JMeter check out BlazeMeter University.

Back to top