-
Notifications
You must be signed in to change notification settings - Fork 636
Reconsider representation of keys for state and block store #1041
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
During Q3 2023, we had an intern experiment with different backends and it was significantly faster to insert 5GB of data into the database in order rather then in a random order (16s vs. 8min). Currently the keys in CometBFT are randomly inserted. Based on those results pruning and compaction seem to also be more efficient and better reflected when the keys are properly ordered. This is why in Q4 2023, we will backport the changes from 0.36 and experiment to confirm their efficiency. |
vanilla 4 node setup:
vanilla 4 node setup w/ pruning
The above are the results I got from running main (148eebd) CometBFT w/ a slightly modified cometbft-db (added the The ideal layout, therefore, is one where the header, block parts, seen commit, ext commit, commit, and validator set from the previous height are grouped under the single prefix:
Note that #1764 is still an improvement over the old design because keys are lex sorted. Note 2: While these are very simple experiments and in the actual network, the access pattern is more random (light clients asking for headers, nodes synching after downtime, RPC fetching blocks), sticking to grouping under a single height is best because well there's close to little pattern in random requests from the entities above. |
#1041 (comment) Most keys are now grouped by height with the exception of block hash's key (-1) and pending evidence (-2): ``` header: 11/0 block part: 11/1/0 block part 2: 11/1/1 ... commit: 11/2 seen commit: 11/3 ext commit: 11/4 validator set: 11/5 consensus params: 11/6 abci responses: 11/7 committed evidence: 11/8 ``` ``` block hash: -1/{hash} pending evidence: -2/11/{ev.Hash} ``` ``` light block: {chainID}/9/11 size: {chainID}/10 ``` Refs #1041
Closes #2057 , #1041 If we keep the current design, we are also closing #1822 Supersedes #1764 This PR implements support for an additional DB key representation. The different key layout sorts the entries by height instead of lexicographically as in the current version of Comet. When starting this work, we hoped that the new layout would significantly outperform the current layout. As we do not have sufficient real world evidence for this, this PR introduces a DB key layout interface that would allow Comet to easily integrate a more preferential key representation without major breaking changes. The layout using ordercode is introduced as experimental, allowing users to easily experiment with this. This layout was thoroughly tested as part of #1044 and all results will be in a report closing the mentioned PR. Locally tested: - Empty stores get initialized with v2 - Existing stores without a version key get initialized to v1 and the key is set - When a nodes' stores are deleted and we boot it up again that node uses v2 while the rest of the nodes use v1 <!-- Please add a reference to the issue that this PR addresses and indicate which files are most critical to review. If it fully addresses a particular issue, please include "Closes #XXX" (where "XXX" is the issue number). If this PR is non-trivial/large/complex, please ensure that you have either created an issue that the team's had a chance to respond to, or had some discussion with the team prior to submitting substantial pull requests. The team can be reached via GitHub Discussions or the Cosmos Network Discord server in the #cometbft channel. GitHub Discussions is preferred over Discord as it allows us to keep track of conversations topically. https://github.com/cometbft/cometbft/discussions If the work in this PR is not aligned with the team's current priorities, please be advised that it may take some time before it is merged - especially if it has not yet been discussed with the team. See the project board for the team's current priorities: https://github.com/orgs/cometbft/projects/1 --> --- #### PR checklist - [x] Tests written/updated - [x] Changelog entry added in `.changelog` (we use [unclog](https://github.com/informalsystems/unclog) to manage our changelog) - [ ] Updated relevant documentation (`docs/` or `spec/`) and code comments - [x] Title follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) spec --------- Co-authored-by: Anton Kaliaev <anton.kalyaev@gmail.com>
Closes #2057 , #1041 If we keep the current design, we are also closing #1822 Supersedes #1764 This PR implements support for an additional DB key representation. The different key layout sorts the entries by height instead of lexicographically as in the current version of Comet. When starting this work, we hoped that the new layout would significantly outperform the current layout. As we do not have sufficient real world evidence for this, this PR introduces a DB key layout interface that would allow Comet to easily integrate a more preferential key representation without major breaking changes. The layout using ordercode is introduced as experimental, allowing users to easily experiment with this. This layout was thoroughly tested as part of #1044 and all results will be in a report closing the mentioned PR. Locally tested: - Empty stores get initialized with v2 - Existing stores without a version key get initialized to v1 and the key is set - When a nodes' stores are deleted and we boot it up again that node uses v2 while the rest of the nodes use v1 <!-- Please add a reference to the issue that this PR addresses and indicate which files are most critical to review. If it fully addresses a particular issue, please include "Closes #XXX" (where "XXX" is the issue number). If this PR is non-trivial/large/complex, please ensure that you have either created an issue that the team's had a chance to respond to, or had some discussion with the team prior to submitting substantial pull requests. The team can be reached via GitHub Discussions or the Cosmos Network Discord server in the #cometbft channel. GitHub Discussions is preferred over Discord as it allows us to keep track of conversations topically. https://github.com/cometbft/cometbft/discussions If the work in this PR is not aligned with the team's current priorities, please be advised that it may take some time before it is merged - especially if it has not yet been discussed with the team. See the project board for the team's current priorities: https://github.com/orgs/cometbft/projects/1 --> --- #### PR checklist - [x] Tests written/updated - [x] Changelog entry added in `.changelog` (we use [unclog](https://github.com/informalsystems/unclog) to manage our changelog) - [ ] Updated relevant documentation (`docs/` or `spec/`) and code comments - [x] Title follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) spec --------- Co-authored-by: Anton Kaliaev <anton.kalyaev@gmail.com> (cherry picked from commit 55638e8)
Closes #2057 , #1041 If we keep the current design, we are also closing #1822 Supersedes #1764 This PR implements support for an additional DB key representation. The different key layout sorts the entries by height instead of lexicographically as in the current version of Comet. When starting this work, we hoped that the new layout would significantly outperform the current layout. As we do not have sufficient real world evidence for this, this PR introduces a DB key layout interface that would allow Comet to easily integrate a more preferential key representation without major breaking changes. The layout using ordercode is introduced as experimental, allowing users to easily experiment with this. This layout was thoroughly tested as part of #1044 and all results will be in a report closing the mentioned PR. Locally tested: - Empty stores get initialized with v2 - Existing stores without a version key get initialized to v1 and the key is set - When a nodes' stores are deleted and we boot it up again that node uses v2 while the rest of the nodes use v1 --- #### PR checklist - [x] Tests written/updated - [x] Changelog entry added in `.changelog` (we use [unclog](https://github.com/informalsystems/unclog) to manage our changelog) - [ ] Updated relevant documentation (`docs/` or `spec/`) and code comments - [x] Title follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) spec <hr>This is an automatic backport of pull request #2327 done by [Mergify](https://mergify.com). Co-authored-by: Jasmina Malicevic <jasmina.dustinac@gmail.com>
Uh oh!
There was an error while loading. Please reload this page.
To save state and block data, CometBFT generates keys with string + height prefixes. They are at the moment internally sorted lexicographically.
This potentiall impacts both data access time (lookup) as well as the performance of compaction.
Some work in Q2 2023 indicates that changing the way keys are represented and forcing them to be ordered by height improved compaction and the disk footprint of the blockstore (28MB shrank to 18MB). This was however a POC and the generated data size was probably not big enough to be certain of gains.
Also, it is not 100% clear whether sorting all types of data by height is desired. Talking to users and analyzing the access patterns should help with that.
We need to:
store: order-preserving varint key encoding tendermint/tendermint#5771 . It is ported into this work. )
This would potentially resolve or improve informalsystems/interchain#1
DoD
mtx, base, height
fields from theBlockStore
struct https://github.com/cometbft/cometbft/pull/1856/files#r1430831931The text was updated successfully, but these errors were encountered: