Add stats for readonly cache evicts (#26938)

* add stats for readonly cache evicts

* bump up account cache to 400M

* aggregate num_evicts in the loop
This commit is contained in:
HaoranYi 2022-08-15 16:23:37 -05:00 committed by GitHub
parent 091d69d218
commit 1a90cffabe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 4 deletions

View File

@ -1902,7 +1902,7 @@ impl AccountsDb {
num_hash_scan_passes: Option<usize>, num_hash_scan_passes: Option<usize>,
) -> Self { ) -> Self {
let num_threads = get_thread_count(); let num_threads = get_thread_count();
const MAX_READ_ONLY_CACHE_DATA_SIZE: usize = 200_000_000; const MAX_READ_ONLY_CACHE_DATA_SIZE: usize = 400_000_000; // 400M bytes
let mut temp_accounts_hash_cache_path = None; let mut temp_accounts_hash_cache_path = None;
let accounts_hash_cache_path = accounts_hash_cache_path.unwrap_or_else(|| { let accounts_hash_cache_path = accounts_hash_cache_path.unwrap_or_else(|| {
@ -7637,7 +7637,7 @@ 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) = let (read_only_cache_hits, read_only_cache_misses, read_only_cache_evicts) =
self.read_only_accounts_cache.get_and_reset_stats(); self.read_only_accounts_cache.get_and_reset_stats();
datapoint_info!( datapoint_info!(
"accounts_db_store_timings", "accounts_db_store_timings",
@ -7704,6 +7704,11 @@ impl AccountsDb {
read_only_cache_misses, read_only_cache_misses,
i64 i64
), ),
(
"read_only_accounts_cache_evicts",
read_only_cache_evicts,
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

@ -38,6 +38,7 @@ pub(crate) struct ReadOnlyAccountsCache {
data_size: AtomicUsize, data_size: AtomicUsize,
hits: AtomicU64, hits: AtomicU64,
misses: AtomicU64, misses: AtomicU64,
evicts: AtomicU64,
} }
impl ReadOnlyAccountsCache { impl ReadOnlyAccountsCache {
@ -49,6 +50,7 @@ impl ReadOnlyAccountsCache {
data_size: AtomicUsize::default(), data_size: AtomicUsize::default(),
hits: AtomicU64::default(), hits: AtomicU64::default(),
misses: AtomicU64::default(), misses: AtomicU64::default(),
evicts: AtomicU64::default(),
} }
} }
@ -107,13 +109,16 @@ impl ReadOnlyAccountsCache {
} }
}; };
// Evict entries from the front of the queue. // Evict entries from the front of the queue.
let mut num_evicts = 0;
while self.data_size.load(Ordering::Relaxed) > self.max_data_size { while self.data_size.load(Ordering::Relaxed) > self.max_data_size {
let (pubkey, slot) = match self.queue.lock().unwrap().get_first() { let (pubkey, slot) = match self.queue.lock().unwrap().get_first() {
None => break, None => break,
Some(key) => *key, Some(key) => *key,
}; };
num_evicts += 1;
self.remove(pubkey, slot); self.remove(pubkey, slot);
} }
self.evicts.fetch_add(num_evicts, Ordering::Relaxed);
} }
pub(crate) fn remove(&self, pubkey: Pubkey, slot: Slot) -> Option<AccountSharedData> { pub(crate) fn remove(&self, pubkey: Pubkey, slot: Slot) -> Option<AccountSharedData> {
@ -135,10 +140,12 @@ impl ReadOnlyAccountsCache {
self.data_size.load(Ordering::Relaxed) self.data_size.load(Ordering::Relaxed)
} }
pub(crate) fn get_and_reset_stats(&self) -> (u64, u64) { pub(crate) fn get_and_reset_stats(&self) -> (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);
(hits, misses) let evicts = self.evicts.swap(0, Ordering::Relaxed);
(hits, misses, evicts)
} }
} }