AcctIdx: report age in stats (#20025)
This commit is contained in:
committed by
GitHub
parent
e9ee90a121
commit
6399a87485
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user