Jmeter is used to run the test profiles.
The objective is to test performance and robustness of quorum under high volume of transactions over a longer duration.
To achieve this, the tests are designed in such a way to simulate high volume of transactions flowing into quorum from different nodes in the network concurrently.
Each test profile creates one or more threads (param: no_of_threads
) per node and runs those threads concurrently. Each thread sends transactions(create/update SimpleStorage contract as public/private) to a specified node(from default account of that node) continuously for a given period of time (param: duration_of_run
).
Private transactions have only one participants in privateFor
by default.
The private transactions are executed in each node in such a way that:
- transaction submitted in
node0
is betweennode0
&node1
- transaction submitted in
node1
is betweennode1
&node2
- ...
- transaction submitted in
node[N]
is betweennode[N]
andnode0
Private transactions have only one participant in privateFor
field.
Once the test has finished running, charts on profiles(like cpu & memory usage, tps, etc) can be saved down from AWS cloudwatch.
Profile No | Test profile name | Transaction | Description |
---|---|---|---|
1 | 1node/deploy-contract-public |
create simpleStorage public contract (with constructor initialised to random number) | creates specified no of threads for first node. sends transactions to first node only. |
2 | 1node/deploy-contract-private |
create simpleStorage private contract (with constructor initialised to random number) | same as profile 1 |
3 | 1node/update-contract-public |
update simpleStorage public contract (with setter initialised to random number) | same as profile 1 |
4 | 1node/update-contract-private |
update simpleStorage private contract (with setter initialised to random number) | same as profile 1 |
5 | 4node/deploy-contract-public |
create simpleStorage public contract (with constructor - initialised to random number) | creates specified no of threads for each node (first 4 nodes only). sends transactions to first 4 nodes only. |
6 | 4node/deploy-contract-private |
create simpleStorage private contract (with constructor - initialised to random number) | same as profile 5 |
7 | custom/deploy-contract-public |
create simpleStorage public contract (with constructor - initialised to random number) | creates specified no of threads and each thread will work on one of the nodes specified in the .csv input file. |
8 | custom/deploy-contract-private |
create simpleStorage private contract (with constructor - initialised to random number) | same as profile 7 |
9 | custom/deploy-mixed-contract |
create simpleStorage private & public contract (with constructor - initialised to random number) | creates specified no of thread pairs and each thread pair will work on one of the nodes specified in the .csv input file sending private and public transactions concurrently. |
Refer to scenario 2 here for all prerequisites.
For further details of the the profiles and how these can be executed, please refer to:
- profiles for executing the stress test from single node, refer here
- profiles for executing the stress test from four nodes in the network, refer here
- If you want to customize and execute the stress test from any number of nodes in the network, refer here
All jmeter test profiles have a backend listener which can be configured so that test results would be published to an influxdb
instance as given in input.
In order to run tests without metrics being pushed to influxDB
, disable the listener by replacing the below line in the test plan jmx files
<BackendListener guiclass="BackendListenerGui" testclass="BackendListener" testname="Backend Listener" enabled="false">