Benchmarking chunk application on the native transfers workload
This doc shows how to:
- Run a single-node localnet with native transfer workload
- Use the
view-statecommand to benchmark applying one of the chunks created during the workload
Running the workload creates ~realistic chunks and state and then we can benchmark applying one of the chunks using this.
Running the initial workload
Clone nearcore and build neard with the tx_generator feature
Note: Building
neardwith--profile dev-releaseinstead of--releasetakes less time and the binary is almost as fast as the release one.
Note: If you plan to gather
perfprofiles, build with--config .cargo/config.profiling.toml(see profiling docs)
git clone https://github.com/near/nearcore
cd nearcore
cargo build -p neard --release --features tx_generator
Build synth-bm
cd benchmarks/synth-bm
cargo build --release
Go to transaction-generator
cd ../transactions-generator/
Create a link to neard
ln -s ../../target/release/neard
Set TPS to 4000
There are two files with the load schedule: tx-generator-settings.json and tx-generator-settings.json.in.
Transaction generator reads data from the tx-generator-settings.json file, not the one with .in suffix. The .in file is used only to store the default values for transaction generator. If tx-generator-settings.json doesn't exist, it's created based on tx-generator-settings.json.in during the first run.
This way you can modify tx-generator-settings.json locally without merge conflicts.
Create tx-generator-settings.json:
cp tx-generator-settings.json.in tx-generator-settings.json
Set tps = 4000 in tx-generator-settings.json. Example jq command (might not work in the future if the file structure changes):
jq '.tx_generator.schedule[0].tps = 4000' tx-generator-settings.json | sponge tx-generator-settings.json
Run the native transfers workload (Ignore "Error: tx generator idle: no schedule provided", this is normal during just create-accounts)
just do-it
This will create a benchmarks/transactions-generator/.near directory with node state, create accounts and run the workload.
Creating accounts takes a few minutes, be patient.
Sometimes running the workload fails because the database LOCK hasn't been freed in time. If that happens run just run-localnet to retry.
Re-running the workload
To re-run the workload run just run-localnet. It's not necessary to do just do-it, which would recreate the state from scratch.
To change TPS edit the tx-generator-settings.json file (without .in !) and run just enable-tx
Preparing state for chunk application benchmark
(Taken from profiling docs)
First, make sure all deltas in flat storage are applied and written:
./neard --home .near view-state --read-write apply-range --storage flat sequential
Then move flat head back 32 blocks to a height that had chunks with high load
./neard --home .near flat-storage move-flat-head back --blocks 32
Benchmarking chunk application
Run these commands to benchmark chunk application at the height to which the flat head was moved.
./neard --home .near view-state apply-range --storage flat benchmark
or
./neard --home .near view-state apply-range --storage memtrie benchmark
or
./neard --home .near view-state apply-range --storage recorded benchmark