From 2f2f3c92c1987677f60b3e3517004a827671e828 Mon Sep 17 00:00:00 2001 From: Dmitry Rodionov Date: Fri, 30 Jun 2023 22:32:15 +0300 Subject: [PATCH] unroll the metrics --- pageserver/src/metrics.rs | 42 ++++++++++++++++++++++++++++++++++++ pageserver/src/page_cache.rs | 38 +++++++++++++------------------- 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/pageserver/src/metrics.rs b/pageserver/src/metrics.rs index 8e7ab87b56..d8ebdbe30c 100644 --- a/pageserver/src/metrics.rs +++ b/pageserver/src/metrics.rs @@ -139,6 +139,24 @@ pub static PAGE_CACHE_READ_ACCESSES: Lazy = Lazy::new(|| { .expect("failed to define a metric") }); +pub static PAGE_CACHE_READ_ACCESSES_MATERIALIZED_PAGE: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_ACCESSES + .get_metric_with_label_values(&["materialized_page"]) + .unwrap() +}); + +pub static PAGE_CACHE_READ_ACCESSES_EPHEMERAL: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_ACCESSES + .get_metric_with_label_values(&["ephemeral"]) + .unwrap() +}); + +pub static PAGE_CACHE_READ_ACCESSES_IMMUTABLE: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_ACCESSES + .get_metric_with_label_values(&["immutable"]) + .unwrap() +}); + pub static PAGE_CACHE_READ_HITS: Lazy = Lazy::new(|| { register_int_counter_vec!( "pageserver_page_cache_read_hits_total", @@ -148,6 +166,30 @@ pub static PAGE_CACHE_READ_HITS: Lazy = Lazy::new(|| { .expect("failed to define a metric") }); +pub static PAGE_CACHE_READ_HITS_EPHEMERAL: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_HITS + .get_metric_with_label_values(&["ephemeral", "-"]) + .unwrap() +}); + +pub static PAGE_CACHE_READ_HITS_IMMUTABLE: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_HITS + .get_metric_with_label_values(&["immutable", "-"]) + .unwrap() +}); + +pub static PAGE_CACHE_READ_HITS_MATERIALIZED_PAGE_EXACT: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_HITS + .get_metric_with_label_values(&["materialized_page", "exact"]) + .unwrap() +}); + +pub static PAGE_CACHE_READ_HITS_MATERIALIZED_PAGE_OLDER_LSN: Lazy = Lazy::new(|| { + PAGE_CACHE_READ_HITS + .get_metric_with_label_values(&["materialized_page", "older_lsn"]) + .unwrap() +}); + static WAIT_LSN_TIME: Lazy = Lazy::new(|| { register_histogram_vec!( "pageserver_wait_lsn_seconds", diff --git a/pageserver/src/page_cache.rs b/pageserver/src/page_cache.rs index b15fb022e4..90434ec6d9 100644 --- a/pageserver/src/page_cache.rs +++ b/pageserver/src/page_cache.rs @@ -313,10 +313,7 @@ impl PageCache { key: &Key, lsn: Lsn, ) -> Option<(Lsn, PageReadGuard)> { - crate::metrics::PAGE_CACHE_READ_ACCESSES - .get_metric_with_label_values(&["materialized_page"]) - .unwrap() - .inc(); + crate::metrics::PAGE_CACHE_READ_ACCESSES_MATERIALIZED_PAGE.inc(); let mut cache_key = CacheKey::MaterializedPage { hash_key: MaterializedPageHashKey { @@ -334,15 +331,9 @@ impl PageCache { } = cache_key { if available_lsn == lsn { - crate::metrics::PAGE_CACHE_READ_HITS - .get_metric_with_label_values(&["materialized_page", "exact"]) - .unwrap() - .inc(); + crate::metrics::PAGE_CACHE_READ_HITS_MATERIALIZED_PAGE_EXACT.inc(); } else { - crate::metrics::PAGE_CACHE_READ_HITS - .get_metric_with_label_values(&["materialized_page", "older_lsn"]) - .unwrap() - .inc(); + crate::metrics::PAGE_CACHE_READ_HITS_MATERIALIZED_PAGE_OLDER_LSN.inc(); } Some((available_lsn, guard)) } else { @@ -519,26 +510,27 @@ impl PageCache { /// ``` /// fn lock_for_read(&self, cache_key: &mut CacheKey) -> anyhow::Result { - let key_kind = match cache_key { + let (read_access, hit) = match cache_key { CacheKey::MaterializedPage { .. } => { unreachable!("Materialized pages use lookup_materialized_page") } - CacheKey::EphemeralPage { .. } => "ephemeral", - CacheKey::ImmutableFilePage { .. } => "immutable", + CacheKey::EphemeralPage { .. } => ( + &crate::metrics::PAGE_CACHE_READ_ACCESSES_EPHEMERAL, + &crate::metrics::PAGE_CACHE_READ_HITS_EPHEMERAL, + ), + CacheKey::ImmutableFilePage { .. } => ( + &crate::metrics::PAGE_CACHE_READ_ACCESSES_IMMUTABLE, + &crate::metrics::PAGE_CACHE_READ_HITS_IMMUTABLE, + ), }; - crate::metrics::PAGE_CACHE_READ_ACCESSES - .get_metric_with_label_values(&[key_kind]) - .unwrap() - .inc(); + read_access.inc(); + let mut is_first_iteration = true; loop { // First check if the key already exists in the cache. if let Some(read_guard) = self.try_lock_for_read(cache_key) { if is_first_iteration { - crate::metrics::PAGE_CACHE_READ_HITS - .get_metric_with_label_values(&[key_kind, "-"]) - .unwrap() - .inc(); + hit.inc(); } return Ok(ReadBufResult::Found(read_guard)); }