AcctIdx: report age in stats (#20025)

This commit is contained in:
Jeff Washington (jwash)
2021-09-20 14:30:12 -05:00
committed by GitHub
parent e9ee90a121
commit 6399a87485
2 changed files with 34 additions and 4 deletions

View File

@ -110,7 +110,7 @@ impl<T: IndexValue> AccountsIndexStorage<T> {
for _ in 0..bins { for _ in 0..bins {
let index = storage.next_bucket_to_flush(); let index = storage.next_bucket_to_flush();
in_mem[index].flush(); in_mem[index].flush();
storage.stats.report_stats(); storage.stats.report_stats(&storage);
} }
storage.stats.active_threads.fetch_sub(1, Ordering::Relaxed); storage.stats.active_threads.fetch_sub(1, Ordering::Relaxed);
} }

View File

@ -1,6 +1,9 @@
use solana_sdk::timing::AtomicInterval; use crate::accounts_index::IndexValue;
use crate::bucket_map_holder::BucketMapHolder;
use solana_sdk::timing::{timestamp, AtomicInterval};
use std::fmt::Debug; use std::fmt::Debug;
use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::atomic::{AtomicU64, AtomicU8, Ordering};
use std::sync::Arc;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct BucketMapHolderStats { pub struct BucketMapHolderStats {
@ -21,6 +24,8 @@ pub struct BucketMapHolderStats {
pub per_bucket_count: Vec<AtomicU64>, pub per_bucket_count: Vec<AtomicU64>,
pub active_threads: AtomicU64, pub active_threads: AtomicU64,
pub get_range_us: AtomicU64, pub get_range_us: AtomicU64,
last_age: AtomicU8,
last_age_time: AtomicU64,
last_time: AtomicInterval, last_time: AtomicInterval,
} }
@ -48,12 +53,36 @@ impl BucketMapHolderStats {
} }
} }
pub fn report_stats(&self) { pub fn get_elapsed_ms_and_reset(&self) -> u64 {
let now = timestamp();
let last = self.last_age_time.swap(now, Ordering::Relaxed);
now.saturating_sub(last) // could saturate to 0. That is ok.
}
fn ms_per_age<T: IndexValue>(&self, storage: &Arc<BucketMapHolder<T>>) -> u64 {
let elapsed_ms = self.get_elapsed_ms_and_reset();
let mut age_now = storage.current_age();
let last_age = self.last_age.swap(age_now, Ordering::Relaxed);
if last_age > age_now {
// age may have wrapped
age_now += u8::MAX;
}
let age_delta = age_now.saturating_sub(last_age) as u64;
if age_delta > 0 {
elapsed_ms / age_delta
} else {
0
}
}
pub fn report_stats<T: IndexValue>(&self, storage: &Arc<BucketMapHolder<T>>) {
// account index stats every 10 s // account index stats every 10 s
if !self.last_time.should_update(10_000) { if !self.last_time.should_update(10_000) {
return; return;
} }
let ms_per_age = self.ms_per_age(storage);
let mut ct = 0; let mut ct = 0;
let mut min = usize::MAX; let mut min = usize::MAX;
let mut max = 0; let mut max = 0;
@ -133,6 +162,7 @@ impl BucketMapHolderStats {
), ),
("items", self.items.swap(0, Ordering::Relaxed), i64), ("items", self.items.swap(0, Ordering::Relaxed), i64),
("keys", self.keys.swap(0, Ordering::Relaxed), i64), ("keys", self.keys.swap(0, Ordering::Relaxed), i64),
("ms_per_age", ms_per_age, i64),
); );
} }
} }