metric for accounts index insertion time (#18202)

This commit is contained in:
Jeff Washington (jwash) 2021-06-25 08:36:55 -05:00 committed by GitHub
parent 9429d0463c
commit f2a2581259
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 37 deletions

View File

@ -165,6 +165,7 @@ pub struct ErrorCounters {
struct GenerateIndexTimings { struct GenerateIndexTimings {
pub index_time: u64, pub index_time: u64,
pub scan_time: u64, pub scan_time: u64,
pub insertion_time_us: u64,
} }
impl GenerateIndexTimings { impl GenerateIndexTimings {
@ -174,6 +175,7 @@ impl GenerateIndexTimings {
// we cannot accurately measure index insertion time because of many threads and lock contention // we cannot accurately measure index insertion time because of many threads and lock contention
("total_us", self.index_time, i64), ("total_us", self.index_time, i64),
("scan_stores_us", self.scan_time, i64), ("scan_stores_us", self.scan_time, i64),
("insertion_time_us", self.insertion_time_us, i64),
); );
} }
} }
@ -5870,8 +5872,15 @@ impl AccountsDb {
accounts_map accounts_map
} }
fn generate_index_for_slot<'a>(&self, accounts_map: GenerateIndexAccountsMap<'a>, slot: &Slot) { fn generate_index_for_slot<'a>(
if !accounts_map.is_empty() { &self,
accounts_map: GenerateIndexAccountsMap<'a>,
slot: &Slot,
) -> u64 {
if accounts_map.is_empty() {
return 0;
}
let items = accounts_map let items = accounts_map
.iter() .iter()
.map(|(pubkey, (_, store_id, stored_account))| { .map(|(pubkey, (_, store_id, stored_account))| {
@ -5887,7 +5896,7 @@ impl AccountsDb {
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let dirty_pubkeys = self let (dirty_pubkeys, insert_us) = self
.accounts_index .accounts_index
.insert_new_if_missing_into_primary_index(*slot, items); .insert_new_if_missing_into_primary_index(*slot, items);
@ -5908,7 +5917,7 @@ impl AccountsDb {
); );
} }
} }
} insert_us
} }
#[allow(clippy::needless_collect)] #[allow(clippy::needless_collect)]
@ -5923,6 +5932,7 @@ impl AccountsDb {
let outer_slots_len = slots.len(); let outer_slots_len = slots.len();
let chunk_size = (outer_slots_len / 7) + 1; // approximately 400k slots in a snapshot let chunk_size = (outer_slots_len / 7) + 1; // approximately 400k slots in a snapshot
let mut index_time = Measure::start("index"); let mut index_time = Measure::start("index");
let insertion_time_us = AtomicU64::new(0);
let scan_time: u64 = slots let scan_time: u64 = slots
.par_chunks(chunk_size) .par_chunks(chunk_size)
.map(|slots| { .map(|slots| {
@ -5943,7 +5953,8 @@ impl AccountsDb {
scan_time.stop(); scan_time.stop();
scan_time_sum += scan_time.as_us(); scan_time_sum += scan_time.as_us();
self.generate_index_for_slot(accounts_map, slot); let insert_us = self.generate_index_for_slot(accounts_map, slot);
insertion_time_us.fetch_add(insert_us, Ordering::Relaxed);
} }
scan_time_sum scan_time_sum
}) })
@ -5952,6 +5963,7 @@ impl AccountsDb {
let timings = GenerateIndexTimings { let timings = GenerateIndexTimings {
scan_time, scan_time,
index_time: index_time.as_us(), index_time: index_time.as_us(),
insertion_time_us: insertion_time_us.load(Ordering::Relaxed),
}; };
timings.report(); timings.report();

View File

@ -1361,7 +1361,8 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
&self, &self,
slot: Slot, slot: Slot,
items: Vec<(&Pubkey, T)>, items: Vec<(&Pubkey, T)>,
) -> Vec<Pubkey> { ) -> (Vec<Pubkey>, u64) {
// returns (duplicate pubkey mask, insertion time us)
let item_len = items.len(); let item_len = items.len();
let potentially_new_items = items let potentially_new_items = items
.into_iter() .into_iter()
@ -1377,6 +1378,7 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
let mut _reclaims = SlotList::new(); let mut _reclaims = SlotList::new();
let mut duplicate_keys = Vec::with_capacity(item_len / 100); // just an estimate let mut duplicate_keys = Vec::with_capacity(item_len / 100); // just an estimate
let mut w_account_maps = self.get_account_maps_write_lock(); let mut w_account_maps = self.get_account_maps_write_lock();
let mut insert_time = Measure::start("insert_into_primary_index");
potentially_new_items potentially_new_items
.into_iter() .into_iter()
.for_each(|(pubkey, new_item)| { .for_each(|(pubkey, new_item)| {
@ -1391,7 +1393,8 @@ impl<T: 'static + Clone + IsCached + ZeroLamport> AccountsIndex<T> {
} }
}); });
duplicate_keys insert_time.stop();
(duplicate_keys, insert_time.as_us())
} }
// Updates the given pubkey at the given slot with the new account information. // Updates the given pubkey at the given slot with the new account information.