Add bench test for voting threads (#28031)

This commit is contained in:
Ashwin Sekar 2022-09-27 12:12:22 -07:00 committed by GitHub
parent a89010cc89
commit 84acef007c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 5 deletions

View File

@ -37,6 +37,9 @@ use {
},
solana_streamer::socket::SocketAddrSpace,
solana_tpu_client::connection_cache::ConnectionCache,
solana_vote_program::{
vote_state::VoteStateUpdate, vote_transaction::new_vote_state_update_transaction,
},
std::{
sync::{atomic::Ordering, Arc, RwLock},
time::{Duration, Instant},
@ -142,9 +145,37 @@ fn make_programs_txs(txes: usize, hash: Hash) -> Vec<Transaction> {
.collect()
}
fn make_vote_txs(txes: usize) -> Vec<Transaction> {
// 1000 voters
let num_voters = 1000;
let (keypairs, vote_keypairs): (Vec<_>, Vec<_>) = (0..num_voters)
.map(|_| (Keypair::new(), Keypair::new()))
.unzip();
(0..txes)
.map(|i| {
// Quarter of the votes should be filtered out
let vote = if i % 4 == 0 {
VoteStateUpdate::from(vec![(2, 1)])
} else {
VoteStateUpdate::from(vec![(i as u64, 1)])
};
new_vote_state_update_transaction(
vote,
Hash::new_unique(),
&keypairs[i % num_voters],
&vote_keypairs[i % num_voters],
&vote_keypairs[i % num_voters],
None,
)
})
.collect()
}
enum TransactionType {
Accounts,
Programs,
AccountsAndVotes,
ProgramsAndVotes,
}
fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
@ -182,8 +213,18 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
debug!("threads: {} txs: {}", num_threads, txes);
let transactions = match tx_type {
TransactionType::Accounts => make_accounts_txs(txes, &mint_keypair, genesis_config.hash()),
TransactionType::Programs => make_programs_txs(txes, genesis_config.hash()),
TransactionType::Accounts | TransactionType::AccountsAndVotes => {
make_accounts_txs(txes, &mint_keypair, genesis_config.hash())
}
TransactionType::Programs | TransactionType::ProgramsAndVotes => {
make_programs_txs(txes, genesis_config.hash())
}
};
let vote_txs = match tx_type {
TransactionType::AccountsAndVotes | TransactionType::ProgramsAndVotes => {
Some(make_vote_txs(txes))
}
_ => None,
};
// fund all the accounts
@ -210,6 +251,16 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
}
bank.clear_signatures();
let verified: Vec<_> = to_packet_batches(&transactions, PACKETS_PER_BATCH);
let vote_packets = vote_txs.map(|vote_txs| {
let mut packet_batches = to_packet_batches(&vote_txs, PACKETS_PER_BATCH);
for batch in packet_batches.iter_mut() {
for packet in batch.iter_mut() {
packet.meta.set_simple_vote(true);
}
}
packet_batches
});
let ledger_path = get_tmp_ledger_path!();
{
let blockstore = Arc::new(
@ -250,7 +301,14 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
bencher.iter(move || {
let now = Instant::now();
let mut sent = 0;
if let Some(vote_packets) = &vote_packets {
tpu_vote_sender
.send((vote_packets[start..start + chunk_len].to_vec(), None))
.unwrap();
vote_sender
.send((vote_packets[start..start + chunk_len].to_vec(), None))
.unwrap();
}
for v in verified[start..start + chunk_len].chunks(chunk_len / num_threads) {
debug!(
"sending... {}..{} {} v.len: {}",
@ -264,6 +322,7 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
}
verified_sender.send((v.to_vec(), None)).unwrap();
}
check_txs(&signal_receiver2, txes / CHUNKS);
// This signature clear may not actually clear the signatures
@ -279,8 +338,6 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
start += chunk_len;
start %= verified.len();
});
drop(tpu_vote_sender);
drop(vote_sender);
exit.store(true, Ordering::Relaxed);
poh_service.join().unwrap();
}
@ -297,6 +354,16 @@ fn bench_banking_stage_multi_programs(bencher: &mut Bencher) {
bench_banking(bencher, TransactionType::Programs);
}
#[bench]
fn bench_banking_stage_multi_accounts_with_voting(bencher: &mut Bencher) {
bench_banking(bencher, TransactionType::AccountsAndVotes);
}
#[bench]
fn bench_banking_stage_multi_programs_with_voting(bencher: &mut Bencher) {
bench_banking(bencher, TransactionType::ProgramsAndVotes);
}
fn simulate_process_entries(
randomize_txs: bool,
mint_keypair: &Keypair,

View File

@ -169,6 +169,11 @@ impl Meta {
self.flags.set(PacketFlags::TRACER_PACKET, is_tracer);
}
#[inline]
pub fn set_simple_vote(&mut self, is_simple_vote: bool) {
self.flags.set(PacketFlags::SIMPLE_VOTE_TX, is_simple_vote);
}
#[inline]
pub fn forwarded(&self) -> bool {
self.flags.contains(PacketFlags::FORWARDED)