2021-02-16 13:48:20 -08:00
|
|
|
#![allow(clippy::integer_arithmetic)]
|
2021-02-04 07:00:33 -08:00
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
2020-09-11 09:48:06 -07:00
|
|
|
use clap::{crate_description, crate_name, value_t, App, Arg};
|
2020-03-17 11:02:07 -07:00
|
|
|
use rayon::prelude::*;
|
|
|
|
use solana_measure::measure::Measure;
|
2020-04-26 19:07:03 -07:00
|
|
|
use solana_runtime::{
|
2021-01-11 17:00:23 -08:00
|
|
|
accounts::{create_test_accounts, update_accounts_bench, Accounts},
|
2021-06-09 21:21:32 -07:00
|
|
|
accounts_db::AccountShrinkThreshold,
|
2021-05-19 09:50:34 -07:00
|
|
|
accounts_index::AccountSecondaryIndexes,
|
|
|
|
ancestors::Ancestors,
|
2020-04-26 19:07:03 -07:00
|
|
|
};
|
2020-09-08 07:55:09 -07:00
|
|
|
use solana_sdk::{genesis_config::ClusterType, pubkey::Pubkey};
|
2021-05-10 07:22:48 -07:00
|
|
|
use std::{env, fs, path::PathBuf};
|
2020-03-17 11:02:07 -07:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
solana_logger::setup();
|
|
|
|
|
2020-09-11 09:48:06 -07:00
|
|
|
let matches = App::new(crate_name!())
|
|
|
|
.about(crate_description!())
|
|
|
|
.version(solana_version::version!())
|
2020-03-17 11:02:07 -07:00
|
|
|
.arg(
|
|
|
|
Arg::with_name("num_slots")
|
|
|
|
.long("num_slots")
|
|
|
|
.takes_value(true)
|
|
|
|
.value_name("SLOTS")
|
|
|
|
.help("Number of slots to store to."),
|
|
|
|
)
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("num_accounts")
|
|
|
|
.long("num_accounts")
|
|
|
|
.takes_value(true)
|
|
|
|
.value_name("NUM_ACCOUNTS")
|
|
|
|
.help("Total number of accounts"),
|
|
|
|
)
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("iterations")
|
|
|
|
.long("iterations")
|
|
|
|
.takes_value(true)
|
|
|
|
.value_name("ITERATIONS")
|
|
|
|
.help("Number of bench iterations"),
|
|
|
|
)
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("clean")
|
|
|
|
.long("clean")
|
|
|
|
.takes_value(false)
|
|
|
|
.help("Run clean"),
|
|
|
|
)
|
|
|
|
.get_matches();
|
|
|
|
|
|
|
|
let num_slots = value_t!(matches, "num_slots", usize).unwrap_or(4);
|
|
|
|
let num_accounts = value_t!(matches, "num_accounts", usize).unwrap_or(10_000);
|
|
|
|
let iterations = value_t!(matches, "iterations", usize).unwrap_or(20);
|
|
|
|
let clean = matches.is_present("clean");
|
|
|
|
println!("clean: {:?}", clean);
|
|
|
|
|
2020-09-11 09:48:06 -07:00
|
|
|
let path = PathBuf::from(env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_owned()))
|
|
|
|
.join("accounts-bench");
|
2021-02-04 07:00:33 -08:00
|
|
|
println!("cleaning file system: {:?}", path);
|
2020-03-17 11:02:07 -07:00
|
|
|
if fs::remove_dir_all(path.clone()).is_err() {
|
|
|
|
println!("Warning: Couldn't remove {:?}", path);
|
|
|
|
}
|
2021-05-10 07:22:48 -07:00
|
|
|
let accounts = Accounts::new_with_config(
|
|
|
|
vec![path],
|
|
|
|
&ClusterType::Testnet,
|
|
|
|
AccountSecondaryIndexes::default(),
|
|
|
|
false,
|
2021-06-09 21:21:32 -07:00
|
|
|
AccountShrinkThreshold::default(),
|
2021-05-10 07:22:48 -07:00
|
|
|
);
|
2020-03-17 11:02:07 -07:00
|
|
|
println!("Creating {} accounts", num_accounts);
|
|
|
|
let mut create_time = Measure::start("create accounts");
|
|
|
|
let pubkeys: Vec<_> = (0..num_slots)
|
|
|
|
.into_par_iter()
|
|
|
|
.map(|slot| {
|
|
|
|
let mut pubkeys: Vec<Pubkey> = vec![];
|
|
|
|
create_test_accounts(
|
|
|
|
&accounts,
|
|
|
|
&mut pubkeys,
|
|
|
|
num_accounts / num_slots,
|
|
|
|
slot as u64,
|
|
|
|
);
|
|
|
|
pubkeys
|
|
|
|
})
|
|
|
|
.collect();
|
|
|
|
let pubkeys: Vec<_> = pubkeys.into_iter().flatten().collect();
|
|
|
|
create_time.stop();
|
|
|
|
println!(
|
|
|
|
"created {} accounts in {} slots {}",
|
|
|
|
(num_accounts / num_slots) * num_slots,
|
|
|
|
num_slots,
|
|
|
|
create_time
|
|
|
|
);
|
2021-05-20 08:11:56 -07:00
|
|
|
let mut ancestors = Vec::with_capacity(num_slots);
|
2021-05-25 09:01:11 -07:00
|
|
|
ancestors.push(0);
|
2020-03-17 11:02:07 -07:00
|
|
|
for i in 1..num_slots {
|
2021-05-25 09:01:11 -07:00
|
|
|
ancestors.push(i as u64);
|
2020-03-17 11:02:07 -07:00
|
|
|
accounts.add_root(i as u64);
|
|
|
|
}
|
2021-05-20 08:11:56 -07:00
|
|
|
let ancestors = Ancestors::from(ancestors);
|
2021-02-04 07:00:33 -08:00
|
|
|
let mut elapsed = vec![0; iterations];
|
|
|
|
let mut elapsed_store = vec![0; iterations];
|
2020-03-17 11:02:07 -07:00
|
|
|
for x in 0..iterations {
|
|
|
|
if clean {
|
|
|
|
let mut time = Measure::start("clean");
|
2021-05-20 12:36:35 -07:00
|
|
|
accounts.accounts_db.clean_accounts(None, false);
|
2020-03-17 11:02:07 -07:00
|
|
|
time.stop();
|
|
|
|
println!("{}", time);
|
|
|
|
for slot in 0..num_slots {
|
2021-01-11 17:00:23 -08:00
|
|
|
update_accounts_bench(&accounts, &pubkeys, ((x + 1) * num_slots + slot) as u64);
|
2020-03-17 11:02:07 -07:00
|
|
|
accounts.add_root((x * num_slots + slot) as u64);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
let mut pubkeys: Vec<Pubkey> = vec![];
|
|
|
|
let mut time = Measure::start("hash");
|
2021-03-11 18:12:40 -08:00
|
|
|
let results = accounts.accounts_db.update_accounts_hash(0, &ancestors);
|
2020-03-17 11:02:07 -07:00
|
|
|
time.stop();
|
2021-02-04 07:00:33 -08:00
|
|
|
let mut time_store = Measure::start("hash using store");
|
|
|
|
let results_store = accounts.accounts_db.update_accounts_hash_with_index_option(
|
2021-02-10 12:38:00 -08:00
|
|
|
false,
|
2021-02-04 07:00:33 -08:00
|
|
|
false,
|
|
|
|
solana_sdk::clock::Slot::default(),
|
|
|
|
&ancestors,
|
2021-02-10 12:38:00 -08:00
|
|
|
None,
|
2021-02-04 07:00:33 -08:00
|
|
|
);
|
|
|
|
time_store.stop();
|
|
|
|
if results != results_store {
|
|
|
|
error!("results different: \n{:?}\n{:?}", results, results_store);
|
|
|
|
}
|
|
|
|
println!(
|
|
|
|
"hash,{},{},{},{}%",
|
|
|
|
results.0,
|
|
|
|
time,
|
|
|
|
time_store,
|
|
|
|
(time_store.as_us() as f64 / time.as_us() as f64 * 100.0f64) as u32
|
|
|
|
);
|
2020-03-17 11:02:07 -07:00
|
|
|
create_test_accounts(&accounts, &mut pubkeys, 1, 0);
|
2021-02-04 07:00:33 -08:00
|
|
|
elapsed[x] = time.as_us();
|
|
|
|
elapsed_store[x] = time_store.as_us();
|
2020-03-17 11:02:07 -07:00
|
|
|
}
|
|
|
|
}
|
2021-02-04 07:00:33 -08:00
|
|
|
|
|
|
|
for x in elapsed {
|
|
|
|
info!("update_accounts_hash(us),{}", x);
|
|
|
|
}
|
|
|
|
for x in elapsed_store {
|
|
|
|
info!("calculate_accounts_hash_without_index(us),{}", x);
|
|
|
|
}
|
2020-03-17 11:02:07 -07:00
|
|
|
}
|