add metric read_only_cache_load_us (#32559)

This commit is contained in:
Jeff Washington (jwash) 2023-07-31 07:07:13 -07:00 committed by GitHub
parent 58882e33ef
commit bb407d2b62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 19 deletions

View File

@ -8389,8 +8389,12 @@ impl AccountsDb {
fn report_store_timings(&self) { fn report_store_timings(&self) {
if self.stats.last_store_report.should_update(1000) { if self.stats.last_store_report.should_update(1000) {
let (read_only_cache_hits, read_only_cache_misses, read_only_cache_evicts) = let (
self.read_only_accounts_cache.get_and_reset_stats(); read_only_cache_hits,
read_only_cache_misses,
read_only_cache_evicts,
read_only_cache_load_us,
) = self.read_only_accounts_cache.get_and_reset_stats();
datapoint_info!( datapoint_info!(
"accounts_db_store_timings", "accounts_db_store_timings",
( (
@ -8456,6 +8460,11 @@ impl AccountsDb {
read_only_cache_evicts, read_only_cache_evicts,
i64 i64
), ),
(
"read_only_accounts_cache_load_us",
read_only_cache_load_us,
i64
),
( (
"calc_stored_meta_us", "calc_stored_meta_us",
self.stats.calc_stored_meta.swap(0, Ordering::Relaxed), self.stats.calc_stored_meta.swap(0, Ordering::Relaxed),

View File

@ -3,6 +3,7 @@
use { use {
dashmap::{mapref::entry::Entry, DashMap}, dashmap::{mapref::entry::Entry, DashMap},
index_list::{Index, IndexList}, index_list::{Index, IndexList},
solana_measure::measure_us,
solana_sdk::{ solana_sdk::{
account::{AccountSharedData, ReadableAccount}, account::{AccountSharedData, ReadableAccount},
clock::Slot, clock::Slot,
@ -39,6 +40,7 @@ pub(crate) struct ReadOnlyAccountsCache {
hits: AtomicU64, hits: AtomicU64,
misses: AtomicU64, misses: AtomicU64,
evicts: AtomicU64, evicts: AtomicU64,
load_us: AtomicU64,
} }
impl ReadOnlyAccountsCache { impl ReadOnlyAccountsCache {
@ -51,6 +53,7 @@ impl ReadOnlyAccountsCache {
hits: AtomicU64::default(), hits: AtomicU64::default(),
misses: AtomicU64::default(), misses: AtomicU64::default(),
evicts: AtomicU64::default(), evicts: AtomicU64::default(),
load_us: AtomicU64::default(),
} }
} }
@ -63,6 +66,7 @@ impl ReadOnlyAccountsCache {
self.hits.store(0, Ordering::Relaxed); self.hits.store(0, Ordering::Relaxed);
self.misses.store(0, Ordering::Relaxed); self.misses.store(0, Ordering::Relaxed);
self.evicts.store(0, Ordering::Relaxed); self.evicts.store(0, Ordering::Relaxed);
self.load_us.store(0, Ordering::Relaxed);
} }
/// true if pubkey is in cache at slot /// true if pubkey is in cache at slot
@ -71,12 +75,12 @@ impl ReadOnlyAccountsCache {
} }
pub(crate) fn load(&self, pubkey: Pubkey, slot: Slot) -> Option<AccountSharedData> { pub(crate) fn load(&self, pubkey: Pubkey, slot: Slot) -> Option<AccountSharedData> {
let (account, load_us) = measure_us!({
let key = (pubkey, slot); let key = (pubkey, slot);
let Some(mut entry) = self.cache.get_mut(&key) else { let Some(mut entry) = self.cache.get_mut(&key) else {
self.misses.fetch_add(1, Ordering::Relaxed); self.misses.fetch_add(1, Ordering::Relaxed);
return None; return None;
}; };
self.hits.fetch_add(1, Ordering::Relaxed);
// Move the entry to the end of the queue. // Move the entry to the end of the queue.
// self.queue is modified while holding a reference to the cache entry; // self.queue is modified while holding a reference to the cache entry;
// so that another thread cannot write to the same key. // so that another thread cannot write to the same key.
@ -85,7 +89,13 @@ impl ReadOnlyAccountsCache {
queue.remove(entry.index); queue.remove(entry.index);
entry.index = queue.insert_last(key); entry.index = queue.insert_last(key);
} }
Some(entry.account.clone()) let account = entry.account.clone();
drop(entry);
self.hits.fetch_add(1, Ordering::Relaxed);
Some(account)
});
self.load_us.fetch_add(load_us, Ordering::Relaxed);
account
} }
fn account_size(&self, account: &AccountSharedData) -> usize { fn account_size(&self, account: &AccountSharedData) -> usize {
@ -147,12 +157,13 @@ impl ReadOnlyAccountsCache {
self.data_size.load(Ordering::Relaxed) self.data_size.load(Ordering::Relaxed)
} }
pub(crate) fn get_and_reset_stats(&self) -> (u64, u64, u64) { pub(crate) fn get_and_reset_stats(&self) -> (u64, u64, u64, u64) {
let hits = self.hits.swap(0, Ordering::Relaxed); let hits = self.hits.swap(0, Ordering::Relaxed);
let misses = self.misses.swap(0, Ordering::Relaxed); let misses = self.misses.swap(0, Ordering::Relaxed);
let evicts = self.evicts.swap(0, Ordering::Relaxed); let evicts = self.evicts.swap(0, Ordering::Relaxed);
let load_us = self.load_us.swap(0, Ordering::Relaxed);
(hits, misses, evicts) (hits, misses, evicts, load_us)
} }
} }