Method
This document provides a detailed description of the QA process. It is intended to be used by engineers reproducing the experimental setup for future tests of CometBFT. The (first iteration of the) QA process as described in the RELEASES.md document was applied to version v0.34.x in order to have a set of results acting as benchmarking baseline. This baseline is then compared with results obtained in later versions. Out of the testnet-based test cases described in the releases document we focused on two of them: 200 Node Test, and Rotating Nodes Test.Software Dependencies
Infrastructure Requirements to Run the Tests
- An account at Digital Ocean (DO), with a high droplet limit (>202)
- The machine to orchestrate the tests should have the following installed:
- A clone of the testnet repository
- This repository contains all the scripts mentioned in the remainder of this section
- Digital Ocean CLI
- Terraform CLI
- Ansible CLI
- A clone of the testnet repository
Requirements for Result Extraction
- Prometheus DB to collect metrics from nodes
- Prometheus DB to process queries (may be different node from the previous)
- blockstore DB of one of the full nodes in the testnet
200 Node Testnet
Running the test
This section explains how the tests were carried out for reproducibility purposes.-
[If you haven’t done it before]
Follow steps 1-4 of the
README.mdat the top of the testnet repository to configure Terraform, anddoctl. -
Copy file
testnets/testnet200.tomlontotestnet.toml(do NOT commit this change) -
Set the variable
VERSION_TAGin theMakefileto the git hash that is to be tested.- If you are running the base test, which implies an homogeneous network (all nodes are running the same version),
then make sure makefile variable
VERSION2_WEIGHTis set to 0 - If you are running a mixed network, set the variable
VERSION2_TAGto the other version you want deployed in the network. Then adjust the weight variablesVERSION_WEIGHTandVERSION2_WEIGHTto configure the desired proportion of nodes running each of the two configured versions.
- If you are running the base test, which implies an homogeneous network (all nodes are running the same version),
then make sure makefile variable
-
Follow steps 5-10 of the
README.mdto configure and start the 200 node testnet- WARNING: Do NOT forget to run
make terraform-destroyas soon as you are done with the tests (see step 9)
- WARNING: Do NOT forget to run
-
As a sanity check, connect to the Prometheus node’s web interface (port 9090)
and check the graph for the
cometbft_consensus_heightmetric. All nodes should be increasing their heights.-
You can find the Prometheus node’s IP address in
ansible/hostsunder section[prometheus]. -
The following URL will display the metrics
cometbft_consensus_heightandcometbft_mempool_size:
-
You can find the Prometheus node’s IP address in
-
You now need to start the load runner that will produce transaction load.
- If you don’t know the saturation load of the version you are testing, you need to discover it.
- Run
make loadrunners-init. This will copy the loader scripts to thetestnet-load-runnernode and install the load tool. - Find the IP address of the
testnet-load-runnernode inansible/hostsunder section[loadrunners]. sshintotestnet-load-runner.- Edit the script
/root/200-node-loadscript.shin the load runner node to provide the IP address of a full node (for example,validator000). This node will receive all transactions from the load runner node. - Run
/root/200-node-loadscript.shfrom the load runner node.- This script will take about 40 mins to run, so it is suggested to
first run
tmuxin case the ssh session breaks. - It is running 90-seconds-long experiments in a loop with different loads.
- This script will take about 40 mins to run, so it is suggested to
first run
- Edit the script
- Run
- If you already know the saturation load, you can simply run the test (several times) for 90 seconds with a load somewhat
below saturation:
- set makefile variables
LOAD_CONNECTIONS,LOAD_TX_RATE, to values that will produce the desired transaction load. - set
LOAD_TOTAL_TIMEto 90 (seconds). - run “make runload” and wait for it to complete. You may want to run this several times so the data from different runs can be compared.
- set makefile variables
- If you don’t know the saturation load of the version you are testing, you need to discover it.
-
Run
make retrieve-datato gather all relevant data from the testnet into the orchestrating machine- Alternatively, you may want to run
make retrieve-prometheus-dataandmake retrieve-blockstoreseparately. The end result will be the same. make retrieve-blockstoreaccepts the following values in makefile variableRETRIEVE_TARGET_HOSTany: (which is the default) picks up a full node and retrieves the blockstore from that node only.all: retrieves the blockstore from all full nodes; this is extremely slow, and consumes plenty of bandwidth, so use it with care.- the name of a particular full node (e.g.,
validator01): retrieves the blockstore from that node only.
- Alternatively, you may want to run
-
Verify that the data was collected without errors
- at least one blockstore DB for a CometBFT validator
- the Prometheus database from the Prometheus node
- for extra care, you can run
zip -Ton theprometheus.zipfile and (one of) theblockstore.db.zipfile(s)
-
Run
make terraform-destroy- Don’t forget to type
yes! Otherwise you’re in trouble.
- Don’t forget to type
Result Extraction
The method for extracting the results described here is highly manual (and exploratory) at this stage. The CometBFT team should improve it at every iteration to increase the amount of automation.Steps
- Unzip the blockstore into a directory
-
To identify saturation points
-
Extract the latency report for all the experiments.
- Run these commands from the directory containing the
blockstore.dbfolder. - It is advisable to adjust the hash in the
go runcommand to the latest possible. -
- Run these commands from the directory containing the
-
File
report.txtcontains an unordered list of experiments with varying concurrent connections and transaction rate. You will need to separate data per experiment.-
Create files
report01.txt,report02.txt,report04.txtand, for each experiment in filereport.txt, copy its related lines to the filename that matches the number of connections, for example -
Sort the experiments in
report01.txtin ascending tx rate order. Likewise forreport02.txtandreport04.txt. -
Otherwise just keep
report.txt, and skip to the next step.
-
Create files
-
Generate file
report_tabbed.txtby showing the contentsreport01.txt,report02.txt,report04.txtside by side- This effectively creates a table where rows are a particular tx rate and columns are a particular number of websocket connections.
- Combine the column files into a single table file:
- Replace tabs by spaces in all column files. For example,
sed -i.bak 's/\t/ /g' results/report1.txt.
- Replace tabs by spaces in all column files. For example,
- Merge the new column files into one:
paste results/report1.txt results/report2.txt results/report4.txt | column -s $'\t' -t > report_tabbed.txt
-
Extract the latency report for all the experiments.
-
To generate a latency vs throughput plot, extract the data as a CSV
-
- Follow the instructions for the
latency_throughput.pyscript. This plot is useful to visualize the saturation point. - Alternatively, follow the instructions for the
latency_plotter.pyscript. This script generates a series of plots per experiment and configuration that may help with visualizing Latency vs Throughput variation.
-
Extracting Prometheus Metrics
- Stop the prometheus server if it is running as a service (e.g. a
systemdunit). - Unzip the prometheus database retrieved from the testnet, and move it to replace the local prometheus database.
- Start the prometheus server and make sure no error logs appear at start up.
- Identify the time window you want to plot in your graphs.
- Execute the
prometheus_plotter.pyscript for the time window.
Rotating Node Testnet
Running the test
This section explains how the tests were carried out for reproducibility purposes.- [If you haven’t done it before]
Follow steps 1-4 of the
README.mdat the top of the testnet repository to configure Terraform, anddoctl. - Copy file
testnet_rotating.tomlontotestnet.toml(do NOT commit this change) - Set variable
VERSION_TAGto the git hash that is to be tested. - Run
make terraform-apply EPHEMERAL_SIZE=25- WARNING: Do NOT forget to run
make terraform-destroyas soon as you are done with the tests
- WARNING: Do NOT forget to run
- Follow steps 6-10 of the
README.mdto configure and start the “stable” part of the rotating node testnet - As a sanity check, connect to the Prometheus node’s web interface and check the graph for the
tendermint_consensus_heightmetric. All nodes should be increasing their heights. - On a different shell,
- run
make runload LOAD_CONNECTIONS=X LOAD_TX_RATE=Y LOAD_TOTAL_TIME=Z XandYshould reflect a load below the saturation point (see, e.g., this paragraph for further info)Z(in seconds) should be big enough to keep running throughout the test, until we manually stop it in step 9. In principle, a good value forZis7200(2 hours)
- run
- Run
make rotateto start the script that creates the ephemeral nodes, and kills them when they are caught up.- WARNING: If you run this command from your laptop, the laptop needs to be up and connected for the full length of the experiment.
- This is an example Prometheus URL you can use to monitor the test case’s progress
- When the height of the chain reaches 3000, stop the
make runloadscript. - When the rotate script has made two iterations (i.e., all ephemeral nodes have caught up twice)
after height 3000 was reached, stop
make rotate - Run
make stop-network - Run
make retrieve-datato gather all relevant data from the testnet into the orchestrating machine - Verify that the data was collected without errors
- at least one blockstore DB for a CometBFT validator
- the Prometheus database from the Prometheus node
- for extra care, you can run
zip -Ton theprometheus.zipfile and (one of) theblockstore.db.zipfile(s)
- Run
make terraform-destroy
Result Extraction
In order to obtain a latency plot, follow the instructions above for the 200 node experiment, but theresults.txt file contains only one experiment.
As for prometheus, the same method as for the 200 node experiment can be applied.
Vote Extensions Testnet
Running the test
This section explains how the tests were carried out for reproducibility purposes.-
[If you haven’t done it before]
Follow steps 1-4 of the
README.mdat the top of the testnet repository to configure Terraform, anddoctl. -
Copy file
varyVESize.tomlontotestnet.toml(do NOT commit this change). -
Set variable
VERSION_TAGin theMakefileto the git hash that is to be tested. -
Follow steps 5-10 of the
README.mdto configure and start the testnet- WARNING: Do NOT forget to run
make terraform-destroyas soon as you are done with the tests
- WARNING: Do NOT forget to run
-
Configure the load runner to produce the desired transaction load.
- set makefile variables
ROTATE_CONNECTIONS,ROTATE_TX_RATE, to values that will produce the desired transaction load. - set
ROTATE_TOTAL_TIMEto 150 (seconds). - set
ITERATIONSto the number of iterations that each configuration should run for.
- set makefile variables
-
Execute steps 5-10 of the
README.mdfile at the testnet repository. -
Repeat the following steps for each desired
vote_extension_size- Update the configuration (you can skip this step if you didn’t change the
vote_extension_size)- Update the
vote_extensions_sizein thetestnet.tomlto the desired value. make configgenANSIBLE_SSH_RETRIES=10 ansible-playbook ./ansible/re-init-testapp.yaml -u root -i ./ansible/hosts --limit=validators -e "testnet_dir=testnet" -f 20make restart
- Update the
- Run the test
make runloadThis will repeat the testsITERATIONStimes every time it is invoked.
- Collect your data
make retrieve-dataGathers all relevant data from the testnet into the orchestrating machine, inside folderexperiments. Two subfolders are created, one blockstore DB for a CometBFT validator and one for the Prometheus DB data.- Verify that the data was collected without errors with
zip -Ton theprometheus.zipfile and (one of) theblockstore.db.zipfile(s).
- Update the configuration (you can skip this step if you didn’t change the
-
Clean up your setup.
make terraform-destroy; don’t forget that you need to type yes for it to complete.
Result Extraction
In order to obtain a latency plot, follow the instructions above for the 200 node experiment, but:- The
results.txtfile contains only one experiment - Therefore, no need for any
forloops