-
Notifications
You must be signed in to change notification settings - Fork 48
Istanbul BFT Benchmarking
We run load test with golang test tool and deploy containers to kubernetes cluster by helm.
Please make sure there is a prepared kubernetes cluster and go
, kubectl
and helm
are already installed in your enviroment.
To get better test result, each validator deployed to kubernetes node needs to run with enough resources.
If the number of nodes in kubernetes cluster is less than the number of deployed validators, that means at least two of validators will be deplyed on one node
and these two validators will share the resource of the node they deployed to.
You can check the number of nodes in kubernetes cluster by kubectl get nodes
.
The load test deploys 4 validators and uses IBFT
consensus by default. Run load test as the following steps:
NOTE: it might take few minutes to deploy and initial validators.
$ git clone [email protected]:getamis/istanbul-tools.git
$ cd ./istanbul-tools
$ make load-testing
Check the deployed status by the following commands:
- Check kubernetes pods status:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
validator-0-0 1/1 Running 0 1m
validator-1-0 1/1 Running 0 2m
validator-2-0 1/1 Running 0 1m
validator-3-0 1/1 Running 0 1m
- Check helm charts status:
$ helm ls
NAME REVISION UPDATED STATUS CHART NAMESPACE
genesis-block 1 Tue Dec 19 16:22:24 2017 DEPLOYED genesis-block-0.1.0 default
static-nodes 1 Tue Dec 19 16:22:37 2017 DEPLOYED static-nodes-0.1.0 default
validator-0 1 Tue Dec 19 16:22:50 2017 DEPLOYED validator-0.2.3 default
validator-1 1 Tue Dec 19 16:22:45 2017 DEPLOYED validator-0.2.3 default
validator-2 1 Tue Dec 19 16:22:49 2017 DEPLOYED validator-0.2.3 default
validator-3 1 Tue Dec 19 16:22:50 2017 DEPLOYED validator-0.2.3 default
- Interrupt load test:
Try Ctrl+c
to interrupt the load test and clear remaining services.
Use helm to force delete all resources.
$ helm del --purge genesis-block static-nodes validator-0 validator-1 validator-2 validator-3
The test result will be printed out. You can find the test metrics at the end of testing.
- Total number of transactions: The following metric presents the total number of sent transactions is 81920.
counter tx/sent
count: 81920
- TPS of this load test: The following metric presents the peak tps is 835.
histogram tx/tps/response/all
count: 25
min: 0
max: 835
mean: 4.218000e+02
stddev: 3.074906e+02
median: 5.140000e+02
75%: 7.030000e+02
90%: 7.992000e+02
95%: 8.311000e+02
99%: 8.350000e+02
There are many test arguments in load test, try to input different values of arguments to test the performance.
-
Number of validators
- How many validators join in IBFT consensus. (default: 4)
-
Gas limit of block
- Gas limit sets the initial gas limit for the blocks to mine. (default: 31500000)
-
Size of transaction pool
- The buffer size of transactions not mined yet. (default: 20480)
-
Rate of sending transaction
- The period in milliseconds to send transactions for each account. (default: 300)
- NOTE: the validator might run consensus slowly if sending transactions very fast.
The possible reason is there might be a lock mechanism of
StateDB
when verifying transaction and committing new consensus block at the same time.
- Helm chart of load test: https://github.com/getamis/istanbul-tools/tree/master/benchmark/kubernetes
- Script to load test: https://github.com/getamis/istanbul-tools/blob/master/tests/load/load_test.go
- Setup a kubernetes clust: https://kubernetes.io/docs/setup/
- Helm tool: https://docs.helm.sh/