github.com/KYVENetwork/cometbft/v38@v38.0.3/docs/qa/CometBFT-QA-38.md (about)

     1  ---
     2  order: 1
     3  parent:
     4    title: CometBFT QA Results v0.38.x
     5    description: This is a report on the results obtained when running CometBFT v0.38.x on testnets
     6    order: 5
     7  ---
     8  
     9  # CometBFT QA Results v0.38.x
    10  
    11  This iteration of the QA was run on CometBFT `v0.38.0-alpha.2`, the second
    12  `v0.38.x` version from the CometBFT repository.
    13  
    14  The changes with respect to the baseline, `v0.37.0-alpha.3` from Feb 21, 2023,
    15  include the introduction of the `FinalizeBlock` method to complete the full
    16  range of ABCI++ functionality (ABCI 2.0), and other several improvements
    17  described in the
    18  [CHANGELOG](https://github.com/KYVENetwork/cometbft/v38/blob/v0.38.0-alpha.2/CHANGELOG.md).
    19  
    20  ## Issues discovered
    21  
    22  * (critical, fixed) [\#539] and [\#546] - This bug causes the proposer to crash in
    23    `PrepareProposal` because it does not have extensions while it should.
    24    This happens mainly when the proposer was catching up.
    25  * (critical, fixed) [\#562] - There were several bugs in the metrics-related
    26    logic that were causing panics when the testnets were started.
    27  
    28  ## 200 Node Testnet
    29  
    30  As in other iterations of our QA process, we have used a 200-node network as
    31  testbed, plus nodes to introduce load and collect metrics.
    32  
    33  ### Saturation point
    34  
    35  As in previous iterations of our QA experiments, we first find the transaction
    36  load on which the system begins to show a degraded performance. Then we run the
    37  experiments with the system subjected to a load slightly under the saturation
    38  point. The method to identify the saturation point is explained
    39  [here](CometBFT-QA-34.md#saturation-point) and its application to the baseline
    40  is described [here](TMCore-QA-37.md#finding-the-saturation-point).
    41  
    42  The following table summarizes the results for the different experiments
    43  (extracted from
    44  [`v038_report_tabbed.txt`](img38/200nodes/v038_report_tabbed.txt)). The X axis
    45  (`c`) is the number of connections created by the load runner process to the
    46  target node. The Y axis (`r`) is the rate or number of transactions issued per
    47  second.
    48  
    49  |        | c=1       | c=2       | c=4   |
    50  | ------ | --------: | --------: | ----: |
    51  | r=200  | 17800     | **33259** | 33259 |
    52  | r=400  | **35600** | 41565     | 41384 |
    53  | r=800  | 36831     | 38686     | 40816 |
    54  | r=1600 | 40600     | 45034     | 39830 |
    55  
    56  We can observe in the table that the system is saturated beyond the diagonal
    57  defined by the entries `c=1,r=400` and `c=2,r=200`. Entries in the diagonal have
    58  the same amount of transaction load, so we can consider them equivalent. For the
    59  chosen diagonal, the expected number of processed transactions is `1 * 400 tx/s * 89 s = 35600`.
    60  (Note that we use 89 out of 90 seconds of the experiment because the last transaction batch
    61  coincides with the end of the experiment and is thus not sent.) The experiments in the diagonal
    62  below expect double that number, that is, `1 * 800 tx/s * 89 s = 71200`, but the
    63  system is not able to process such load, thus it is saturated.
    64  
    65  Therefore, for the rest of these experiments, we chose `c=1,r=400` as the
    66  configuration. We could have chosen the equivalent `c=2,r=200`, which is the same
    67  used in our baseline version, but for simplicity we decided to use the one with
    68  only one connection.
    69  
    70  Also note that, compared to the previous QA tests, we have tried to find the
    71  saturation point within a higher range of load values for the rate `r`. In
    72  particular we run tests with `r` equal to or above `200`, while in the previous
    73  tests `r` was `200` or lower. In particular, for our baseline version we didn't
    74  run the experiment on the configuration `c=1,r=400`.
    75  
    76  For comparison, this is the table with the baseline version, where the
    77  saturation point is beyond the diagonal defined by `r=200,c=2` and `r=100,c=4`.
    78  
    79  |       | c=1   | c=2       | c=4       |
    80  | ----- | ----: | --------: | --------: |
    81  | r=25  | 2225  | 4450      | 8900      |
    82  | r=50  | 4450  | 8900      | 17800     |
    83  | r=100 | 8900  | 17800     | **35600** |
    84  | r=200 | 17800 | **35600** | 38660     |
    85  
    86  ### Latencies
    87  
    88  The following figure plots the latencies of the experiment carried out with the
    89  configuration `c=1,r=400`.
    90  
    91  ![latency-1-400](img38/200nodes/e_de676ecf-038e-443f-a26a-27915f29e312.png).
    92  
    93  For reference, the following figure shows the latencies of one of the
    94  experiments for `c=2,r=200` in the baseline.
    95  
    96  ![latency-2-200-37](img37/200nodes_cmt037/e_75cb89a8-f876-4698-82f3-8aaab0b361af.png)
    97  
    98  As can be seen, in most cases the latencies are very similar, and in some cases,
    99  the baseline has slightly higher latencies than the version under test. Thus,
   100  from this small experiment, we can say that the latencies measured on the two
   101  versions are equivalent, or at least that the version under test is not worse
   102  than the baseline.
   103  
   104  ### Prometheus Metrics on the Chosen Experiment
   105  
   106  This section further examines key metrics for this experiment extracted from
   107  Prometheus data regarding the chosen experiment with configuration `c=1,r=400`.
   108  
   109  #### Mempool Size
   110  
   111  The mempool size, a count of the number of transactions in the mempool, was
   112  shown to be stable and homogeneous at all full nodes. It did not exhibit any
   113  unconstrained growth. The plot below shows the evolution over time of the
   114  cumulative number of transactions inside all full nodes' mempools at a given
   115  time.
   116  
   117  ![mempoool-cumulative](img38/200nodes/mempool_size.png)
   118  
   119  The following picture shows the evolution of the average mempool size over all
   120  full nodes, which mostly oscilates between 1000 and 2500 outstanding
   121  transactions.
   122  
   123  ![mempool-avg](img38/200nodes/avg_mempool_size.png)
   124  
   125  The peaks observed coincide with the moments when some nodes reached round 1 of
   126  consensus (see below).
   127  
   128  The behavior is similar to the observed in the baseline, presented next.
   129  
   130  ![mempool-cumulative-baseline](img37/200nodes_cmt037/mempool_size.png)
   131  
   132  ![mempool-avg-baseline](img37/200nodes_cmt037/avg_mempool_size.png)
   133  
   134  
   135  #### Peers
   136  
   137  The number of peers was stable at all nodes. It was higher for the seed nodes
   138  (around 140) than for the rest (between 20 and 70 for most nodes). The red
   139  dashed line denotes the average value.
   140  
   141  ![peers](img38/200nodes/peers.png)
   142  
   143  Just as in the baseline, shown next, the fact that non-seed nodes reach more
   144  than 50 peers is due to [\#9548].
   145  
   146  ![peers](img37/200nodes_cmt037/peers.png)
   147  
   148  
   149  #### Consensus Rounds per Height
   150  
   151  Most heights took just one round, that is, round 0, but some nodes needed to
   152  advance to round 1.
   153  
   154  ![rounds](img38/200nodes/rounds.png)
   155  
   156  The following specific run of the baseline required some nodes to reach round 1.
   157  
   158  ![rounds](img37/200nodes_cmt037/rounds.png)
   159  
   160  
   161  #### Blocks Produced per Minute, Transactions Processed per Minute
   162  
   163  The following plot shows the rate in which blocks were created, from the point
   164  of view of each node. That is, it shows when each node learned that a new block
   165  had been agreed upon.
   166  
   167  ![heights](img38/200nodes/block_rate.png)
   168  
   169  For most of the time when load was being applied to the system, most of the
   170  nodes stayed around 20 blocks/minute.
   171  
   172  The spike to more than 100 blocks/minute is due to a slow node catching up.
   173  
   174  The baseline experienced a similar behavior.
   175  
   176  ![heights-baseline](img37/200nodes_cmt037/block_rate.png)
   177  
   178  The collective spike on the right of the graph marks the end of the load
   179  injection, when blocks become smaller (empty) and impose less strain on the
   180  network. This behavior is reflected in the following graph, which shows the
   181  number of transactions processed per minute.
   182  
   183  ![total-txs](img38/200nodes/total_txs_rate.png)
   184  
   185  The following is the transaction processing rate of the baseline, which is
   186  similar to above.
   187  
   188  ![total-txs-baseline](img37/200nodes_cmt037/total_txs_rate.png)
   189  
   190  
   191  #### Memory Resident Set Size
   192  
   193  The following graph shows the Resident Set Size of all monitored processes, with
   194  maximum memory usage of 1.6GB, slightly lower than the baseline shown after.
   195  
   196  ![rss](img38/200nodes/memory.png)
   197  
   198  A similar behavior was shown in the baseline, with even a slightly higher memory
   199  usage.
   200  
   201  ![rss](img37/200nodes_cmt037/memory.png)
   202  
   203  The memory of all processes went down as the load is removed, showing no signs
   204  of unconstrained growth.
   205  
   206  
   207  #### CPU utilization
   208  
   209  ##### Comparison to baseline
   210  
   211  The best metric from Prometheus to gauge CPU utilization in a Unix machine is
   212  `load1`, as it usually appears in the [output of
   213  `top`](https://www.digitalocean.com/community/tutorials/load-average-in-linux).
   214  
   215  The load is contained below 5 on most nodes, as seen in the following graph.
   216  
   217  ![load1](img38/200nodes/cpu.png)
   218  
   219  The baseline had a similar behavior.
   220  
   221  ![load1-baseline](img37/200nodes_cmt037/cpu.png)
   222  
   223  ##### Impact of vote extension signature verification
   224  
   225  It is important to notice that the baseline (`v0.37.x`) does not implement vote extensions,
   226  whereas the version under test (`v0.38.0-alpha.2`) _does_ implement them, and they are
   227  configured to be activated since height 1.
   228  The e2e application used in these tests verifies all received vote extension signatures (up to 175)
   229  twice per height: upon `PrepareProposal` (for sanity) and upon `ProcessProposal` (to demonstrate how
   230  real applications can do it).
   231  
   232  The fact that there is no noticeable difference in the CPU utilization plots of
   233  the baseline and `v0.38.0-alpha.2` means that re-verifying up 175 vote extension signatures twice
   234  (besides the initial verification done by CometBFT when receiving them from the network)
   235  has no performance impact in the current version of the system: the bottlenecks are elsewhere.
   236  Thus, we should focus on optimizing other parts of the system: the ones that cause the current
   237  bottlenecks (mempool gossip duplication, leaner proposal structure, optimized consensus gossip).
   238  
   239  ### Test Results
   240  
   241  The comparison against the baseline results show that both scenarios had similar
   242  numbers and are therefore equivalent.
   243  
   244  A conclusion of these tests is shown in the following table, along with the
   245  commit versions used in the experiments.
   246  
   247  | Scenario | Date       | Version                                                    | Result |
   248  | -------- | ---------- | ---------------------------------------------------------- | ------ |
   249  | 200-node | 2023-05-21 | v0.38.0-alpha.2 (1f524d12996204f8fd9d41aa5aca215f80f06f5e) | Pass   |
   250  
   251  
   252  ## Rotating Node Testnet
   253  
   254  We use `c=1,r=400` as load, which can be considered a safe workload, as it was close to (but below)
   255  the saturation point in the 200 node testnet. This testnet has less nodes (10 validators and 25 full nodes).
   256  
   257  Importantly, the baseline considered in this section is `v0.37.0-alpha.2` (Tendermint Core),
   258  which is **different** from the one used in the [previous section](method.md#200-node-testnet).
   259  The reason is that this testnet was not re-tested for `v0.37.0-alpha.3` (CometBFT),
   260  since it was not deemed necessary.
   261  
   262  Unlike in the baseline tests, the version of CometBFT used for these tests is _not_ affected by [\#9539],
   263  which was fixed right after having run rotating testnet for `v0.37`.
   264  As a result, the load introduced in this iteration of the test is higher as transactions do not get rejected.
   265  
   266  ### Latencies
   267  
   268  The plot of all latencies can be seen here.
   269  
   270  ![rotating-all-latencies](img38/rotating/rotating_latencies.png)
   271  
   272  Which is similar to the baseline.
   273  
   274  ![rotating-all-latencies](img37/200nodes_tm037/v037_rotating_latencies.png)
   275  
   276  The average increase of about 1 second with respect to the baseline is due to the higher
   277  transaction load produced (remember the baseline was affected by [\#9539], whereby most transactions
   278  produced were rejected by `CheckTx`).
   279  
   280  ### Prometheus Metrics
   281  
   282  The set of metrics shown here roughly match those shown on the baseline (`v0.37`) for the same experiment.
   283  We also show the baseline results for comparison.
   284  
   285  #### Blocks and Transactions per minute
   286  
   287  This following plot shows the blocks produced per minute.
   288  
   289  ![rotating-heights](img38/rotating/rotating_block_rate.png)
   290  
   291  This is similar to the baseline, shown below.
   292  
   293  ![rotating-heights-bl](img37/rotating/rotating_block_rate.png)
   294  
   295  The following plot shows only the heights reported by ephemeral nodes, both when they were blocksyncing
   296  and when they were running consensus.
   297  The second plot is the baseline plot for comparison. The baseline lacks the heights when the nodes were
   298  blocksyncing as that metric was implemented afterwards.
   299  
   300  ![rotating-heights-ephe](img38/rotating/rotating_eph_heights.png)
   301  
   302  ![rotating-heights-ephe-bl](img37/rotating/rotating_eph_heights.png)
   303  
   304  We seen that heights follow a similar pattern in both plots: they grow in length as the experiment advances.
   305  
   306  The following plot shows the transactions processed per minute.
   307  
   308  ![rotating-total-txs](img38/rotating/rotating_txs_rate.png)
   309  
   310  For comparison, this is the baseline plot.
   311  
   312  ![rotating-total-txs-bl](img37/rotating/rotating_txs_rate.png)
   313  
   314  We can see the rate is much lower in the baseline plot.
   315  The reason is that the baseline was affected by [\#9539], whereby `CheckTx` rejected most transactions
   316  produced by the load runner.
   317  
   318  #### Peers
   319  
   320  The plot below shows the evolution of the number of peers throughout the experiment.
   321  
   322  ![rotating-peers](img38/rotating/rotating_peers.png)
   323  
   324  This is the baseline plot, for comparison.
   325  
   326  ![rotating-peers-bl](img37/rotating/rotating_peers.png)
   327  
   328  The plotted values and their evolution are comparable in both plots.
   329  
   330  For further details on these plots, see the [this section](./TMCore-QA-34.md#peers-1).
   331  
   332  #### Memory Resident Set Size
   333  
   334  The average Resident Set Size (RSS) over all processes is notably bigger on `v0.38.0-alpha.2` than on the baseline.
   335  The reason for this is, again, the fact that `CheckTx` was rejecting most transactions submitted on the baseline
   336  and therefore the overall transaction load was lower on the baseline.
   337  This is consistent with the difference seen in the transaction rate plots
   338  in the [previous section](#blocks-and-transactions-per-minute).
   339  
   340  ![rotating-rss-avg](img38/rotating/rotating_avg_memory.png)
   341  
   342  ![rotating-rss-avg-bl](img37/rotating/rotating_avg_memory.png)
   343  
   344  #### CPU utilization
   345  
   346  The plots show metric `load1` for all nodes for `v0.38.0-alpha.2` and for the baseline.
   347  
   348  ![rotating-load1](img38/rotating/rotating_cpu.png)
   349  
   350  ![rotating-load1-bl](img37/rotating/rotating_cpu.png)
   351  
   352  In both cases, it is contained under 5 most of the time, which is considered normal load.
   353  The load seems to be more important on `v0.38.0-alpha.2` on average because of the bigger
   354  number of transactions processed per minute as compared to the baseline.
   355  
   356  ### Test Result
   357  
   358  | Scenario | Date       | Version                                                    | Result |
   359  | -------- | ---------- | ---------------------------------------------------------- | ------ |
   360  | Rotating | 2023-05-23 | v0.38.0-alpha.2 (e9abb116e29beb830cf111b824c8e2174d538838) | Pass   |
   361  
   362  
   363  
   364  ## Vote Extensions Testbed
   365  
   366  In this testnet we evaluate the effect of varying the sizes of vote extensions added to pre-commit votes on the performance of CometBFT.
   367  The test uses the Key/Value store in our [[end-to-end]] test framework, which has the following simplified flow:
   368  
   369  1. When validators send their pre-commit votes to a block of height $i$, they first extend the vote as they see fit in `ExtendVote`.
   370  2. When a proposer for height $i+1$ creates a block to propose, in `PrepareProposal`, it prepends the transactions with a special transaction, which modifies a reserved key. The transaction value is derived from the extensions from height $i$; in this example, the value is derived from the vote extensions and includes the set itself, hexa encoded as string.
   371  3. When a validator sends their pre-vote for the block proposed in $i+1$, they first double check in `ProcessProposal` that the special transaction in the block was properly built by the proposer.
   372  4. When validators send their pre-commit for the block proposed in $i+1$, they first extend the vote, and the steps repeat for heights $i+2$ and so on.
   373  
   374  For this test, extensions are random sequences of bytes with a predefined `vote_extension_size`.
   375  Hence, two effects are seen on the network.
   376  First, pre-commit vote message sizes will increase by the specified `vote_extension_size` and, second, block messages will increase by twice  `vote_extension_size`, given then hexa encoding of extensions, times the number of extensions received, i.e. at least 2/3 of 175.
   377  
   378  All tests were performed on commit d5baba237ab3a04c1fd4a7b10927ba2e6a2aab27, which corresponds to v0.38.0-alpha.2 plus commits to add the ability to vary the vote extension sizes to the test application.
   379  Although the same commit is used for the baseline, in this configuration the behavior observed is the same as in the "vanilla" v0.38.0-alpha.2 test application, that is, vote extensions are 8-byte integers, compressed as variable size integers instead of a random sequence of size `vote_extension_size`.
   380  
   381  The following table summarizes the test cases.
   382  
   383  | Name     | Extension Size (bytes) | Date       |
   384  | -------- | ---------------------- | ---------- |
   385  | baseline | 8 (varint)             | 2023-05-26 |
   386  | 2k       | 2048                   | 2023-05-29 |
   387  | 4k       | 4094                   | 2023-05-29 |
   388  | 8k       | 8192                   | 2023-05-26 |
   389  | 16k      | 16384                  | 2023-05-26 |
   390  | 32k      | 32768                  | 2023-05-26 |
   391  
   392  
   393  ### Latency
   394  
   395  The following figures show the latencies observed on each of the 5 runs of each experiment;
   396  the redline shows the average of each run.
   397  It can be easily seen from these graphs that the larger the vote extension size, the more latency varies and the more common higher latencies become.
   398  Even in the case of extensions of size 2k, the mean latency goes from below 5s to nearly 10s.
   399  
   400  **Baseline**
   401  
   402  ![](img38/voteExtensions/all_experiments_baseline.png)
   403  
   404  **2k**
   405  
   406  ![](img38/voteExtensions/all_experiments_2k.png)
   407  
   408  **4k**
   409  
   410  ![](img38/voteExtensions/all_experiments_4k.png)
   411  
   412  **8k**
   413  
   414  ![](img38/voteExtensions/all_experiments_8k.png)
   415  
   416  **16k**
   417  
   418  ![](img38/voteExtensions/all_experiments_16k.png)
   419  
   420  **32k**
   421  
   422  ![](img38/voteExtensions/all_experiments_32k.png)
   423  
   424  The following graphs combine all the runs of the same experiment.
   425  They show that latency variation greatly increases with the increase of vote extensions.
   426  In particular, for the 16k and 32k cases, the system goes through large gaps without transaction delivery.
   427  As discussed later, this is the result of heights taking multiple rounds to finish and new transactions being held until the next block is agreed upon.
   428  
   429  |                                                            |                                                  |
   430  | ---------------------------------------------------------- | ------------------------------------------------ |
   431  | baseline ![](img38/voteExtensions/all_c1r400_baseline.png) | 2k ![](img38/voteExtensions/all_c1r400_2k.png)   |
   432  | 4k ![](img38/voteExtensions/all_c1r400_4k.png)             | 8k ![](img38/voteExtensions/all_c1r400_8k.png)   |
   433  | 16k ![](img38/voteExtensions/all_c1r400_16k.png)           | 32k ![](img38/voteExtensions/all_c1r400_32k.png) |
   434  
   435  
   436  ### Blocks and Transactions per minute
   437  
   438  The following plots show the blocks produced per minute and transactions processed per minute.
   439  We have divided the presentation in an overview section, which shows the metrics for the whole experiment (five runs) and a detailed sample, which shows the metrics for the first of the five runs.
   440  We repeat the approach for the other metrics as well.
   441  The dashed red line shows the moving average over a 20s window.
   442  
   443  #### Overview
   444  
   445  It is clear from the overview  plots that as the vote extension sizes increase, the rate of block creation decreases.
   446  Although the rate of transaction processing also decreases, it does not seem to decrease as fast.
   447  
   448  | Experiment   | Block creation rate                                         | Transaction rate                                              |
   449  | ------------ | ----------------------------------------------------------- | ------------------------------------------------------------- |
   450  | **baseline** | ![block rate](img38/voteExtensions/baseline_block_rate.png) | ![txs rate](img38/voteExtensions/baseline_total_txs_rate.png) |
   451  | **2k**       | ![block rate](img38/voteExtensions/02k_block_rate.png)      | ![txs rate](img38/voteExtensions/02k_total_txs_rate.png)      |
   452  | **4k**       | ![block rate](img38/voteExtensions/04k_block_rate.png)      | ![txs rate](img38/voteExtensions/04k_total_txs_rate.png)      |
   453  | **8k**       | ![block rate](img38/voteExtensions/8k_block_rate.png)       | ![txs rate](img38/voteExtensions/08k_total_txs_rate.png)      |
   454  | **16k**      | ![block rate](img38/voteExtensions/16k_block_rate.png)      | ![txs rate](img38/voteExtensions/16k_total_txs_rate.png)      |
   455  | **32k**      | ![block rate](img38/voteExtensions/32k_block_rate.png)      | ![txs rate](img38/voteExtensions/32k_total_txs_rate.png)      |
   456  
   457  #### First run
   458  
   459  | Experiment   | Block creation rate                                           | Transaction rate                                                |
   460  | ------------ | ------------------------------------------------------------- | --------------------------------------------------------------- |
   461  | **baseline** | ![block rate](img38/voteExtensions/baseline_1_block_rate.png) | ![txs rate](img38/voteExtensions/baseline_1_total_txs_rate.png) |
   462  | **2k**       | ![block rate](img38/voteExtensions/02k_1_block_rate.png)      | ![txs rate](img38/voteExtensions/02k_1_total_txs_rate.png)      |
   463  | **4k**       | ![block rate](img38/voteExtensions/04k_1_block_rate.png)      | ![txs rate](img38/voteExtensions/04k_1_total_txs_rate.png)      |
   464  | **8k**       | ![block rate](img38/voteExtensions/08k_1_block_rate.png)      | ![txs rate](img38/voteExtensions/08k_1_total_txs_rate.png)      |
   465  | **16k**      | ![block rate](img38/voteExtensions/16k_1_block_rate.png)      | ![txs rate](img38/voteExtensions/16k_1_total_txs_rate.png)      |
   466  | **32k**      | ![block rate](img38/voteExtensions/32k_1_block_rate.png)      | ![txs rate](img38/voteExtensions/32k_1_total_txs_rate.png)      |
   467  
   468  
   469  ### Number of rounds
   470  
   471  The effect of vote extensions are also felt on the number of rounds needed to reach consensus.
   472  The following graphs show the number of the highest round required to reach consensus during the whole experiment.
   473  
   474  In the baseline and low vote extension lengths, most blocks were agreed upon during round 0.
   475  As the load increases, more and more rounds were required.
   476  In the 32k case se see round 5 being reached frequently.
   477  
   478  | Experiment   | Number of Rounds per block                                    |
   479  | ------------ | ------------------------------------------------------------- |
   480  | **baseline** | ![number of rounds](img38/voteExtensions/baseline_rounds.png) |
   481  | **2k**       | ![number of rounds](img38/voteExtensions/02k_rounds.png)      |
   482  | **4k**       | ![number of rounds](img38/voteExtensions/04k_rounds.png)      |
   483  | **8k**       | ![number of rounds](img38/voteExtensions/08k_rounds.png)      |
   484  | **16k**      | ![number of rounds](img38/voteExtensions/16k_rounds.png)      |
   485  | **32k**      | ![number of rounds](img38/voteExtensions/32k_rounds.png)      |
   486  
   487  
   488  We conjecture that the reason is that the timeouts used are inadequate for the extra traffic in the network.
   489  
   490  ### CPU
   491  
   492  The CPU usage reached the same peaks on all tests, but the following graphs show that with larger Vote Extensions, nodes take longer to reduce the CPU usage.
   493  This could mean that a backlog of processing is forming during the execution of the tests with larger extensions.
   494  
   495  
   496  | Experiment   | CPU                                                   |
   497  | ------------ | ----------------------------------------------------- |
   498  | **baseline** | ![cpu-avg](img38/voteExtensions/baseline_avg_cpu.png) |
   499  | **2k**       | ![cpu-avg](img38/voteExtensions/02k_avg_cpu.png)      |
   500  | **4k**       | ![cpu-avg](img38/voteExtensions/04k_avg_cpu.png)      |
   501  | **8k**       | ![cpu-avg](img38/voteExtensions/08k_avg_cpu.png)      |
   502  | **16k**      | ![cpu-avg](img38/voteExtensions/16k_avg_cpu.png)      |
   503  | **32k**      | ![cpu-avg](img38/voteExtensions/32k_avg_cpu.png)      |
   504  
   505  ### Resident Memory
   506  
   507  The same conclusion reached for CPU usage may be drawn for the memory.
   508  That is, that a backlog of work is formed during the tests and catching up (freeing of memory) happens after the test is done.
   509  
   510  A more worrying trend is that the bottom of the memory usage seems to increase in between runs.
   511  We have investigated this in longer runs and confirmed that there is no such a trend.
   512  
   513  
   514  
   515  | Experiment   | Resident Set Size                                        |
   516  | ------------ | -------------------------------------------------------- |
   517  | **baseline** | ![rss-avg](img38/voteExtensions/baseline_avg_memory.png) |
   518  | **2k**       | ![rss-avg](img38/voteExtensions/02k_avg_memory.png)      |
   519  | **4k**       | ![rss-avg](img38/voteExtensions/04k_avg_memory.png)      |
   520  | **8k**       | ![rss-avg](img38/voteExtensions/08k_avg_memory.png)      |
   521  | **16k**      | ![rss-avg](img38/voteExtensions/16k_avg_memory.png)      |
   522  | **32k**      | ![rss-avg](img38/voteExtensions/32k_avg_memory.png)      |
   523  
   524  ### Mempool size
   525  
   526  This metric shows how many transactions are outstanding in the nodes' mempools.
   527  Observe that in all runs, the average number of transactions in the mempool quickly drops to near zero between runs.
   528  
   529  
   530  | Experiment   | Resident Set Size                                                  |
   531  | ------------ | ------------------------------------------------------------------ |
   532  | **baseline** | ![mempool-avg](img38/voteExtensions/baseline_avg_mempool_size.png) |
   533  | **2k**       | ![mempool-avg](img38/voteExtensions/02k_avg_mempool_size.png)      |
   534  | **4k**       | ![mempool-avg](img38/voteExtensions/04k_avg_mempool_size.png)      |
   535  | **8k**       | ![mempool-avg](img38/voteExtensions/08k_avg_mempool_size.png)      |
   536  | **16k**      | ![mempool-avg](img38/voteExtensions/16k_avg_mempool_size.png)      |
   537  | **32k**      | ![mempool-avg](img38/voteExtensions/32k_avg_mempool_size.png)      |
   538  
   539  
   540  
   541  
   542  
   543  ### Results
   544  
   545  | Scenario | Date       | Version                                                                               | Result |
   546  | -------- | ---------- | ------------------------------------------------------------------------------------- | ------ |
   547  | VESize   | 2023-05-23 | v0.38.0-alpha.2 + varying vote extensions  (9fc711b6514f99b2dc0864fc703cb81214f01783) |  N/A   |
   548  
   549  
   550  
   551  [\#9539]: https://github.com/tendermint/tendermint/issues/9539
   552  [\#9548]: https://github.com/tendermint/tendermint/issues/9548
   553  [\#539]: https://github.com/KYVENetwork/cometbft/v38/issues/539
   554  [\#546]: https://github.com/KYVENetwork/cometbft/v38/issues/546
   555  [\#562]: https://github.com/KYVENetwork/cometbft/v38/issues/562
   556  [end-to-end]: https://github.com/KYVENetwork/cometbft/v38/tree/main/test/e2e