2021-12-03 09:00:31 -08:00
|
|
|
use {
|
2023-02-24 11:02:06 -08:00
|
|
|
crate::{
|
|
|
|
accounts_index::{DiskIndexValue, IndexValue},
|
|
|
|
bucket_map_holder::BucketMapHolder,
|
|
|
|
},
|
2021-12-03 09:00:31 -08:00
|
|
|
solana_sdk::timing::AtomicInterval,
|
|
|
|
std::{
|
|
|
|
fmt::Debug,
|
|
|
|
sync::atomic::{AtomicBool, AtomicU64, AtomicU8, AtomicUsize, Ordering},
|
|
|
|
},
|
|
|
|
};
|
2021-09-12 15:14:59 -07:00
|
|
|
|
2021-09-24 14:00:41 -07:00
|
|
|
// stats logged every 10 s
|
|
|
|
const STATS_INTERVAL_MS: u64 = 10_000;
|
|
|
|
|
2023-03-03 10:05:05 -08:00
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct BucketMapHeldInMemStats {
|
|
|
|
pub ref_count: AtomicU64,
|
|
|
|
pub slot_list_len: AtomicU64,
|
|
|
|
pub slot_list_cached: AtomicU64,
|
|
|
|
}
|
|
|
|
|
2021-09-12 15:14:59 -07:00
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct BucketMapHolderStats {
|
2023-03-03 10:05:05 -08:00
|
|
|
pub held_in_mem: BucketMapHeldInMemStats,
|
2021-09-12 15:14:59 -07:00
|
|
|
pub get_mem_us: AtomicU64,
|
|
|
|
pub gets_from_mem: AtomicU64,
|
|
|
|
pub get_missing_us: AtomicU64,
|
|
|
|
pub gets_missing: AtomicU64,
|
2021-09-13 06:33:45 -07:00
|
|
|
pub entry_mem_us: AtomicU64,
|
|
|
|
pub entries_from_mem: AtomicU64,
|
|
|
|
pub entry_missing_us: AtomicU64,
|
|
|
|
pub entries_missing: AtomicU64,
|
2021-09-23 06:14:08 -07:00
|
|
|
pub load_disk_found_count: AtomicU64,
|
|
|
|
pub load_disk_found_us: AtomicU64,
|
|
|
|
pub load_disk_missing_count: AtomicU64,
|
|
|
|
pub load_disk_missing_us: AtomicU64,
|
2021-09-13 13:59:01 -07:00
|
|
|
pub updates_in_mem: AtomicU64,
|
2021-09-12 15:14:59 -07:00
|
|
|
pub items: AtomicU64,
|
2021-12-17 07:59:29 -08:00
|
|
|
pub items_us: AtomicU64,
|
2022-03-22 07:19:38 -07:00
|
|
|
pub failed_to_evict: AtomicU64,
|
2021-09-12 15:14:59 -07:00
|
|
|
pub keys: AtomicU64,
|
|
|
|
pub deletes: AtomicU64,
|
2023-03-22 15:04:17 -07:00
|
|
|
pub buckets_scanned: AtomicU64,
|
2021-09-13 13:59:01 -07:00
|
|
|
pub inserts: AtomicU64,
|
2021-11-30 09:35:21 -08:00
|
|
|
count: AtomicUsize,
|
2021-09-23 11:37:14 -07:00
|
|
|
pub bg_waiting_us: AtomicU64,
|
2021-09-29 05:42:54 -07:00
|
|
|
pub bg_throttling_wait_us: AtomicU64,
|
2021-11-30 09:35:21 -08:00
|
|
|
pub count_in_mem: AtomicUsize,
|
|
|
|
pub per_bucket_count: Vec<AtomicUsize>,
|
2021-09-22 07:55:40 -07:00
|
|
|
pub flush_entries_updated_on_disk: AtomicU64,
|
2022-03-18 15:13:21 -07:00
|
|
|
pub flush_entries_evicted_from_mem: AtomicU64,
|
2021-09-20 07:44:40 -07:00
|
|
|
pub active_threads: AtomicU64,
|
2021-09-17 15:19:29 -07:00
|
|
|
pub get_range_us: AtomicU64,
|
2021-09-20 12:30:12 -07:00
|
|
|
last_age: AtomicU8,
|
2021-11-18 09:01:19 -08:00
|
|
|
last_ages_flushed: AtomicU64,
|
2022-03-17 21:09:41 -07:00
|
|
|
pub flush_scan_us: AtomicU64,
|
|
|
|
pub flush_update_us: AtomicU64,
|
2022-03-18 15:13:21 -07:00
|
|
|
pub flush_evict_us: AtomicU64,
|
2021-10-05 13:22:01 -07:00
|
|
|
pub flush_grow_us: AtomicU64,
|
2021-10-15 11:04:32 -07:00
|
|
|
last_was_startup: AtomicBool,
|
2021-09-18 07:55:20 -07:00
|
|
|
last_time: AtomicInterval,
|
2021-11-18 09:01:19 -08:00
|
|
|
bins: u64,
|
2022-03-17 06:46:00 -07:00
|
|
|
pub estimate_mem: AtomicU64,
|
|
|
|
pub flush_should_evict_us: AtomicU64,
|
2021-09-12 15:14:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl BucketMapHolderStats {
|
2021-09-13 17:26:49 -07:00
|
|
|
pub fn new(bins: usize) -> BucketMapHolderStats {
|
|
|
|
BucketMapHolderStats {
|
2021-11-18 09:01:19 -08:00
|
|
|
bins: bins as u64,
|
2023-01-05 10:05:32 -08:00
|
|
|
per_bucket_count: (0..bins).map(|_| AtomicUsize::default()).collect(),
|
2021-09-13 17:26:49 -07:00
|
|
|
..BucketMapHolderStats::default()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-21 11:10:41 -07:00
|
|
|
pub fn inc_insert(&self) {
|
2022-06-22 06:45:42 -07:00
|
|
|
self.inc_insert_count(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn inc_insert_count(&self, count: u64) {
|
|
|
|
self.inserts.fetch_add(count, Ordering::Relaxed);
|
|
|
|
self.count.fetch_add(count as usize, Ordering::Relaxed);
|
2022-06-08 07:05:37 -07:00
|
|
|
}
|
|
|
|
|
2022-06-21 11:10:41 -07:00
|
|
|
pub fn inc_delete(&self) {
|
2022-06-08 07:05:37 -07:00
|
|
|
self.deletes.fetch_add(1, Ordering::Relaxed);
|
|
|
|
self.count.fetch_sub(1, Ordering::Relaxed);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn inc_mem_count(&self, bin: usize) {
|
|
|
|
self.add_mem_count(bin, 1);
|
2021-09-23 06:14:53 -07:00
|
|
|
}
|
|
|
|
|
2022-06-08 07:05:37 -07:00
|
|
|
pub fn dec_mem_count(&self, bin: usize) {
|
|
|
|
self.sub_mem_count(bin, 1);
|
2021-10-12 14:13:32 -07:00
|
|
|
}
|
|
|
|
|
2022-06-08 07:05:37 -07:00
|
|
|
pub fn add_mem_count(&self, bin: usize, count: usize) {
|
2021-09-23 06:14:53 -07:00
|
|
|
let per_bucket = self.per_bucket_count.get(bin);
|
2022-06-08 07:05:37 -07:00
|
|
|
self.count_in_mem.fetch_add(count, Ordering::Relaxed);
|
|
|
|
per_bucket.map(|stat| stat.fetch_add(count, Ordering::Relaxed));
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn sub_mem_count(&self, bin: usize, count: usize) {
|
|
|
|
let per_bucket = self.per_bucket_count.get(bin);
|
|
|
|
self.count_in_mem.fetch_sub(count, Ordering::Relaxed);
|
|
|
|
per_bucket.map(|stat| stat.fetch_sub(count, Ordering::Relaxed));
|
2021-09-13 17:26:49 -07:00
|
|
|
}
|
|
|
|
|
2023-02-24 11:02:06 -08:00
|
|
|
fn ms_per_age<T: IndexValue, U: DiskIndexValue + From<T> + Into<T>>(
|
2023-02-23 13:05:06 -08:00
|
|
|
&self,
|
|
|
|
storage: &BucketMapHolder<T, U>,
|
|
|
|
elapsed_ms: u64,
|
|
|
|
) -> u64 {
|
2021-11-18 09:01:19 -08:00
|
|
|
let age_now = storage.current_age();
|
2022-06-02 10:16:01 -07:00
|
|
|
let ages_flushed = storage.count_buckets_flushed() as u64;
|
2021-11-18 09:01:19 -08:00
|
|
|
let last_age = self.last_age.swap(age_now, Ordering::Relaxed) as u64;
|
2022-11-09 11:39:38 -08:00
|
|
|
let last_ages_flushed = self.last_ages_flushed.swap(ages_flushed, Ordering::Relaxed);
|
2021-11-18 09:01:19 -08:00
|
|
|
let mut age_now = age_now as u64;
|
|
|
|
if last_age > age_now {
|
|
|
|
// age wrapped
|
|
|
|
age_now += u8::MAX as u64 + 1;
|
|
|
|
}
|
2022-11-09 11:39:38 -08:00
|
|
|
let age_delta = age_now.saturating_sub(last_age);
|
2021-11-18 09:01:19 -08:00
|
|
|
if age_delta > 0 {
|
|
|
|
return elapsed_ms / age_delta;
|
|
|
|
} else {
|
|
|
|
// did not advance an age, but probably did partial work, so report that
|
|
|
|
let bin_delta = ages_flushed.saturating_sub(last_ages_flushed);
|
|
|
|
if bin_delta > 0 {
|
|
|
|
return elapsed_ms * self.bins / bin_delta;
|
2021-09-27 06:25:23 -07:00
|
|
|
}
|
2021-09-20 12:30:12 -07:00
|
|
|
}
|
2021-09-27 06:25:23 -07:00
|
|
|
0 // avoid crazy numbers
|
2021-09-20 12:30:12 -07:00
|
|
|
}
|
|
|
|
|
2021-09-24 14:00:41 -07:00
|
|
|
pub fn remaining_until_next_interval(&self) -> u64 {
|
|
|
|
self.last_time
|
|
|
|
.remaining_until_next_interval(STATS_INTERVAL_MS)
|
|
|
|
}
|
|
|
|
|
2021-10-08 11:58:38 -07:00
|
|
|
/// return min, max, sum, median of data
|
2021-11-30 09:35:21 -08:00
|
|
|
fn get_stats(mut data: Vec<usize>) -> (usize, usize, usize, usize) {
|
2021-10-08 11:58:38 -07:00
|
|
|
if data.is_empty() {
|
|
|
|
(0, 0, 0, 0)
|
|
|
|
} else {
|
|
|
|
data.sort_unstable();
|
|
|
|
(
|
|
|
|
*data.first().unwrap(),
|
|
|
|
*data.last().unwrap(),
|
|
|
|
data.iter().sum(),
|
|
|
|
data[data.len() / 2],
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-12 16:59:41 -08:00
|
|
|
fn calc_percent(ms: u64, elapsed_ms: u64) -> f32 {
|
2021-10-26 13:09:17 -07:00
|
|
|
if elapsed_ms == 0 {
|
|
|
|
0.0
|
|
|
|
} else {
|
2021-10-27 16:08:27 -07:00
|
|
|
(ms as f32 / elapsed_ms as f32) * 100.0
|
2021-10-26 13:09:17 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-30 09:35:21 -08:00
|
|
|
pub fn total_count(&self) -> usize {
|
|
|
|
self.count.load(Ordering::Relaxed)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn count_in_bucket(&self, bucket: usize) -> usize {
|
|
|
|
if bucket < self.per_bucket_count.len() {
|
|
|
|
self.per_bucket_count[bucket].load(Ordering::Relaxed)
|
|
|
|
} else {
|
|
|
|
0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-20 17:56:20 -07:00
|
|
|
/// This is an estimate of the # of items in mem that are awaiting flushing to disk.
|
|
|
|
/// returns (# items in mem) - (# items we intend to hold in mem for performance heuristics)
|
|
|
|
/// The result is also an estimate because 'held_in_mem' is based on a stat that is swapped out when stats are reported.
|
|
|
|
pub fn get_remaining_items_to_flush_estimate(&self) -> usize {
|
|
|
|
let in_mem = self.count_in_mem.load(Ordering::Relaxed) as u64;
|
2023-03-03 10:05:05 -08:00
|
|
|
let held_in_mem = self.held_in_mem.slot_list_cached.load(Ordering::Relaxed)
|
|
|
|
+ self.held_in_mem.slot_list_len.load(Ordering::Relaxed)
|
|
|
|
+ self.held_in_mem.ref_count.load(Ordering::Relaxed);
|
2022-03-20 17:56:20 -07:00
|
|
|
in_mem.saturating_sub(held_in_mem) as usize
|
|
|
|
}
|
|
|
|
|
2023-02-24 11:02:06 -08:00
|
|
|
pub fn report_stats<T: IndexValue, U: DiskIndexValue + From<T> + Into<T>>(
|
2023-02-23 13:05:06 -08:00
|
|
|
&self,
|
|
|
|
storage: &BucketMapHolder<T, U>,
|
|
|
|
) {
|
2021-11-17 15:16:48 -08:00
|
|
|
let elapsed_ms = self.last_time.elapsed_ms();
|
|
|
|
if elapsed_ms < STATS_INTERVAL_MS {
|
2021-09-18 07:55:20 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-17 15:16:48 -08:00
|
|
|
if !self.last_time.should_update(STATS_INTERVAL_MS) {
|
|
|
|
return;
|
|
|
|
}
|
2021-10-26 13:09:17 -07:00
|
|
|
|
|
|
|
let ms_per_age = self.ms_per_age(storage, elapsed_ms);
|
2021-09-20 12:30:12 -07:00
|
|
|
|
2021-10-08 11:58:38 -07:00
|
|
|
let in_mem_per_bucket_counts = self
|
|
|
|
.per_bucket_count
|
|
|
|
.iter()
|
|
|
|
.map(|count| count.load(Ordering::Relaxed))
|
|
|
|
.collect::<Vec<_>>();
|
2021-09-22 16:17:20 -07:00
|
|
|
let disk = storage.disk.as_ref();
|
2021-10-08 11:58:38 -07:00
|
|
|
let disk_per_bucket_counts = disk
|
|
|
|
.map(|disk| {
|
2021-12-16 19:25:54 -08:00
|
|
|
(0..self.bins)
|
|
|
|
.map(|i| disk.get_bucket_from_index(i as usize).bucket_len() as usize)
|
2021-10-08 11:58:38 -07:00
|
|
|
.collect::<Vec<_>>()
|
|
|
|
})
|
|
|
|
.unwrap_or_default();
|
|
|
|
let in_mem_stats = Self::get_stats(in_mem_per_bucket_counts);
|
|
|
|
let disk_stats = Self::get_stats(disk_per_bucket_counts);
|
2021-09-22 16:17:20 -07:00
|
|
|
|
2021-10-26 13:09:17 -07:00
|
|
|
const US_PER_MS: u64 = 1_000;
|
|
|
|
|
2021-10-15 11:04:32 -07:00
|
|
|
// all metrics during startup are written to a different data point
|
|
|
|
let startup = storage.get_startup();
|
|
|
|
let was_startup = self.last_was_startup.swap(startup, Ordering::Relaxed);
|
2021-10-26 13:09:17 -07:00
|
|
|
|
|
|
|
// sum of elapsed time in each thread
|
|
|
|
let mut thread_time_elapsed_ms = elapsed_ms * storage.threads as u64;
|
2021-11-22 13:26:25 -08:00
|
|
|
if disk.is_some() {
|
|
|
|
datapoint_info!(
|
|
|
|
if startup || was_startup {
|
|
|
|
thread_time_elapsed_ms *= 2; // more threads are allocated during startup
|
|
|
|
"accounts_index_startup"
|
|
|
|
} else {
|
|
|
|
"accounts_index"
|
|
|
|
},
|
2022-03-17 06:46:00 -07:00
|
|
|
(
|
|
|
|
"estimate_mem_bytes",
|
|
|
|
self.estimate_mem.load(Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"flush_should_evict_us",
|
|
|
|
self.flush_should_evict_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"count_in_mem",
|
|
|
|
self.count_in_mem.load(Ordering::Relaxed),
|
|
|
|
i64
|
2021-10-26 13:09:17 -07:00
|
|
|
),
|
2021-11-30 09:35:21 -08:00
|
|
|
("count", self.total_count(), i64),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"bg_waiting_percent",
|
|
|
|
Self::calc_percent(
|
|
|
|
self.bg_waiting_us.swap(0, Ordering::Relaxed) / US_PER_MS,
|
|
|
|
thread_time_elapsed_ms
|
|
|
|
),
|
|
|
|
f64
|
2021-10-26 13:09:17 -07:00
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"bg_throttling_wait_percent",
|
|
|
|
Self::calc_percent(
|
|
|
|
self.bg_throttling_wait_us.swap(0, Ordering::Relaxed) / US_PER_MS,
|
|
|
|
thread_time_elapsed_ms
|
|
|
|
),
|
|
|
|
f64
|
|
|
|
),
|
|
|
|
(
|
2023-03-03 10:05:05 -08:00
|
|
|
"slot_list_len",
|
|
|
|
self.held_in_mem.slot_list_len.swap(0, Ordering::Relaxed),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
2023-02-22 06:57:59 -08:00
|
|
|
(
|
2023-03-03 10:05:05 -08:00
|
|
|
"ref_count",
|
|
|
|
self.held_in_mem.ref_count.swap(0, Ordering::Relaxed),
|
2023-02-22 06:57:59 -08:00
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
2023-03-03 10:05:05 -08:00
|
|
|
"slot_list_cached",
|
|
|
|
self.held_in_mem.slot_list_cached.swap(0, Ordering::Relaxed),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
("min_in_bin_mem", in_mem_stats.0, i64),
|
|
|
|
("max_in_bin_mem", in_mem_stats.1, i64),
|
|
|
|
("count_from_bins_mem", in_mem_stats.2, i64),
|
|
|
|
("median_from_bins_mem", in_mem_stats.3, i64),
|
|
|
|
("min_in_bin_disk", disk_stats.0, i64),
|
|
|
|
("max_in_bin_disk", disk_stats.1, i64),
|
|
|
|
("count_from_bins_disk", disk_stats.2, i64),
|
|
|
|
("median_from_bins_disk", disk_stats.3, i64),
|
|
|
|
(
|
|
|
|
"gets_from_mem",
|
|
|
|
self.gets_from_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_mem_us",
|
|
|
|
self.get_mem_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"gets_missing",
|
|
|
|
self.gets_missing.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_missing_us",
|
|
|
|
self.get_missing_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entries_from_mem",
|
|
|
|
self.entries_from_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entry_mem_us",
|
|
|
|
self.entry_mem_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"load_disk_found_count",
|
|
|
|
self.load_disk_found_count.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"load_disk_found_us",
|
|
|
|
self.load_disk_found_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"load_disk_missing_count",
|
|
|
|
self.load_disk_missing_count.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"load_disk_missing_us",
|
|
|
|
self.load_disk_missing_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entries_missing",
|
|
|
|
self.entries_missing.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entry_missing_us",
|
|
|
|
self.entry_missing_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
2022-03-22 07:19:38 -07:00
|
|
|
(
|
|
|
|
"failed_to_evict",
|
|
|
|
self.failed_to_evict.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"updates_in_mem",
|
|
|
|
self.updates_in_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_range_us",
|
|
|
|
self.get_range_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
("inserts", self.inserts.swap(0, Ordering::Relaxed), i64),
|
|
|
|
("deletes", self.deletes.swap(0, Ordering::Relaxed), i64),
|
|
|
|
(
|
|
|
|
"active_threads",
|
|
|
|
self.active_threads.load(Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
("items", self.items.swap(0, Ordering::Relaxed), i64),
|
|
|
|
("keys", self.keys.swap(0, Ordering::Relaxed), i64),
|
|
|
|
("ms_per_age", ms_per_age, i64),
|
2023-03-22 15:04:17 -07:00
|
|
|
(
|
|
|
|
"buckets_scanned",
|
|
|
|
self.buckets_scanned.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
2022-03-17 21:09:41 -07:00
|
|
|
"flush_scan_us",
|
|
|
|
self.flush_scan_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"flush_update_us",
|
|
|
|
self.flush_update_us.swap(0, Ordering::Relaxed),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"flush_grow_us",
|
2021-12-15 15:05:38 -08:00
|
|
|
self.flush_grow_us.swap(0, Ordering::Relaxed),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
2022-03-18 15:13:21 -07:00
|
|
|
"flush_evict_us",
|
|
|
|
self.flush_evict_us.swap(0, Ordering::Relaxed),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_resizes",
|
|
|
|
disk.map(|disk| disk.stats.index.resizes.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
2023-04-04 09:39:06 -07:00
|
|
|
(
|
|
|
|
"disk_index_failed_resizes",
|
|
|
|
disk.map(|disk| disk.stats.index.failed_resizes.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"disk_index_max_size",
|
2023-01-10 07:15:27 -08:00
|
|
|
disk.map(|disk| { disk.stats.index.max_size.swap(0, Ordering::Relaxed) })
|
|
|
|
.unwrap_or_default(),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_new_file_us",
|
|
|
|
disk.map(|disk| disk.stats.index.new_file_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_resize_us",
|
|
|
|
disk.map(|disk| disk.stats.index.resize_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_flush_file_us",
|
|
|
|
disk.map(|disk| disk.stats.index.flush_file_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
2023-03-20 08:22:31 -07:00
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_index_file_size",
|
|
|
|
disk.map(|disk| disk.stats.index.total_file_size.load(Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_data_file_size",
|
|
|
|
disk.map(|disk| disk.stats.data.total_file_size.load(Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_index_data_file_count",
|
|
|
|
disk.map(|disk| disk.stats.data.file_count.load(Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
2021-11-22 13:26:25 -08:00
|
|
|
),
|
2022-07-25 12:47:17 -07:00
|
|
|
(
|
2023-03-29 06:54:03 -07:00
|
|
|
"disk_index_find_index_entry_mut_us",
|
2022-07-25 12:47:17 -07:00
|
|
|
disk.map(|disk| disk
|
|
|
|
.stats
|
|
|
|
.index
|
2023-03-29 06:54:03 -07:00
|
|
|
.find_index_entry_mut_us
|
2022-07-25 12:47:17 -07:00
|
|
|
.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"disk_index_flush_mmap_us",
|
|
|
|
disk.map(|disk| disk.stats.index.mmap_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_resizes",
|
|
|
|
disk.map(|disk| disk.stats.data.resizes.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_max_size",
|
2023-01-10 07:15:27 -08:00
|
|
|
disk.map(|disk| { disk.stats.data.max_size.swap(0, Ordering::Relaxed) })
|
|
|
|
.unwrap_or_default(),
|
2021-11-22 13:26:25 -08:00
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_new_file_us",
|
|
|
|
disk.map(|disk| disk.stats.data.new_file_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_resize_us",
|
|
|
|
disk.map(|disk| disk.stats.data.resize_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_flush_file_us",
|
|
|
|
disk.map(|disk| disk.stats.data.flush_file_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"disk_data_flush_mmap_us",
|
|
|
|
disk.map(|disk| disk.stats.data.mmap_us.swap(0, Ordering::Relaxed))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"flush_entries_updated_on_disk",
|
|
|
|
self.flush_entries_updated_on_disk
|
|
|
|
.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
2022-03-18 15:13:21 -07:00
|
|
|
"flush_entries_evicted_from_mem",
|
|
|
|
self.flush_entries_evicted_from_mem
|
2021-11-22 13:26:25 -08:00
|
|
|
.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
datapoint_info!(
|
|
|
|
if startup || was_startup {
|
|
|
|
thread_time_elapsed_ms *= 2; // more threads are allocated during startup
|
|
|
|
"accounts_index_startup"
|
|
|
|
} else {
|
|
|
|
"accounts_index"
|
|
|
|
},
|
|
|
|
(
|
|
|
|
"count_in_mem",
|
|
|
|
self.count_in_mem.load(Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
2021-11-30 09:35:21 -08:00
|
|
|
("count", self.total_count(), i64),
|
2021-11-22 13:26:25 -08:00
|
|
|
(
|
|
|
|
"bg_waiting_percent",
|
|
|
|
Self::calc_percent(
|
|
|
|
self.bg_waiting_us.swap(0, Ordering::Relaxed) / US_PER_MS,
|
|
|
|
thread_time_elapsed_ms
|
|
|
|
),
|
|
|
|
f64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"bg_throttling_wait_percent",
|
|
|
|
Self::calc_percent(
|
|
|
|
self.bg_throttling_wait_us.swap(0, Ordering::Relaxed) / US_PER_MS,
|
|
|
|
thread_time_elapsed_ms
|
|
|
|
),
|
|
|
|
f64
|
|
|
|
),
|
|
|
|
("min_in_bin_mem", in_mem_stats.0, i64),
|
|
|
|
("max_in_bin_mem", in_mem_stats.1, i64),
|
|
|
|
("count_from_bins_mem", in_mem_stats.2, i64),
|
|
|
|
("median_from_bins_mem", in_mem_stats.3, i64),
|
|
|
|
(
|
|
|
|
"gets_from_mem",
|
|
|
|
self.gets_from_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_mem_us",
|
|
|
|
self.get_mem_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"gets_missing",
|
|
|
|
self.gets_missing.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_missing_us",
|
|
|
|
self.get_missing_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entries_from_mem",
|
|
|
|
self.entries_from_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entry_mem_us",
|
|
|
|
self.entry_mem_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entries_missing",
|
|
|
|
self.entries_missing.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"entry_missing_us",
|
|
|
|
self.entry_missing_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"updates_in_mem",
|
|
|
|
self.updates_in_mem.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"get_range_us",
|
|
|
|
self.get_range_us.swap(0, Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
("inserts", self.inserts.swap(0, Ordering::Relaxed), i64),
|
|
|
|
("deletes", self.deletes.swap(0, Ordering::Relaxed), i64),
|
|
|
|
(
|
|
|
|
"active_threads",
|
|
|
|
self.active_threads.load(Ordering::Relaxed),
|
|
|
|
i64
|
|
|
|
),
|
|
|
|
("items", self.items.swap(0, Ordering::Relaxed), i64),
|
2021-12-17 07:59:29 -08:00
|
|
|
("items_us", self.items_us.swap(0, Ordering::Relaxed), i64),
|
2021-11-22 13:26:25 -08:00
|
|
|
("keys", self.keys.swap(0, Ordering::Relaxed), i64),
|
|
|
|
);
|
|
|
|
}
|
2021-09-12 15:14:59 -07:00
|
|
|
}
|
|
|
|
}
|