Skip to content

Commit d430144

Browse files
authored
Add metrics tracking to ClockRing, ARC, CAR, and ClockPro policies (#30)
- Introduced metrics for tracking cache operations, including hand advances, reference bit resets, and eviction counts in `ClockRing`. - Enhanced `ARC`, `CAR`, and `ClockPro` policies with metrics for get calls, hits, misses, and evictions, improving observability of cache behavior. - Implemented snapshot structures for metrics, allowing for easy retrieval and reporting of performance data. - Updated documentation to include new metrics features and usage examples, ensuring clarity on how to leverage metrics for performance monitoring. - Ensured all changes align with performance goals, maintaining efficient memory usage and O(1) complexity for critical operations.
1 parent 1c0fb42 commit d430144

20 files changed

Lines changed: 2837 additions & 239 deletions

src/ds/clock_ring.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,10 @@ pub struct ClockRing<K, V> {
262262
index: FxHashMap<K, usize>,
263263
hand: usize,
264264
len: usize,
265+
#[cfg(feature = "metrics")]
266+
sweep_hand_advances: u64,
267+
#[cfg(feature = "metrics")]
268+
sweep_ref_bit_resets: u64,
265269
}
266270

267271
/// Thread-safe wrapper around [`ClockRing`] using `parking_lot::RwLock`.
@@ -1102,6 +1106,10 @@ where
11021106
index: FxHashMap::with_capacity_and_hasher(capacity, Default::default()),
11031107
hand: 0,
11041108
len: 0,
1109+
#[cfg(feature = "metrics")]
1110+
sweep_hand_advances: 0,
1111+
#[cfg(feature = "metrics")]
1112+
sweep_ref_bit_resets: 0,
11051113
}
11061114
}
11071115

@@ -1173,6 +1181,11 @@ where
11731181
self.referenced.fill(false);
11741182
self.len = 0;
11751183
self.hand = 0;
1184+
#[cfg(feature = "metrics")]
1185+
{
1186+
self.sweep_hand_advances = 0;
1187+
self.sweep_ref_bit_resets = 0;
1188+
}
11761189
}
11771190

11781191
/// Clears all entries and shrinks internal storage.
@@ -1195,6 +1208,20 @@ where
11951208
self.referenced.shrink_to_fit();
11961209
}
11971210

1211+
/// Cumulative hand advances during sweep operations.
1212+
#[cfg(feature = "metrics")]
1213+
#[inline]
1214+
pub fn sweep_hand_advances(&self) -> u64 {
1215+
self.sweep_hand_advances
1216+
}
1217+
1218+
/// Cumulative reference-bit resets during sweep operations.
1219+
#[cfg(feature = "metrics")]
1220+
#[inline]
1221+
pub fn sweep_ref_bit_resets(&self) -> u64 {
1222+
self.sweep_ref_bit_resets
1223+
}
1224+
11981225
/// Returns an approximate memory footprint in bytes.
11991226
///
12001227
/// # Example
@@ -1491,7 +1518,15 @@ where
14911518
let idx = self.hand;
14921519
if self.referenced[idx] {
14931520
self.referenced[idx] = false;
1521+
#[cfg(feature = "metrics")]
1522+
{
1523+
self.sweep_ref_bit_resets += 1;
1524+
}
14941525
self.advance_hand();
1526+
#[cfg(feature = "metrics")]
1527+
{
1528+
self.sweep_hand_advances += 1;
1529+
}
14951530
continue;
14961531
}
14971532

@@ -1506,6 +1541,10 @@ where
15061541
self.referenced[idx] = false;
15071542
self.index.insert(key, idx);
15081543
self.advance_hand();
1544+
#[cfg(feature = "metrics")]
1545+
{
1546+
self.sweep_hand_advances += 1;
1547+
}
15091548
return Some((evicted.key, evicted.value));
15101549
}
15111550
debug_assert!(
@@ -1587,7 +1626,15 @@ where
15871626
if self.slots[idx].is_some() {
15881627
if self.referenced[idx] {
15891628
self.referenced[idx] = false;
1629+
#[cfg(feature = "metrics")]
1630+
{
1631+
self.sweep_ref_bit_resets += 1;
1632+
}
15901633
self.advance_hand();
1634+
#[cfg(feature = "metrics")]
1635+
{
1636+
self.sweep_hand_advances += 1;
1637+
}
15911638
continue;
15921639
}
15931640

@@ -1596,9 +1643,17 @@ where
15961643
self.referenced[idx] = false;
15971644
self.len -= 1;
15981645
self.advance_hand();
1646+
#[cfg(feature = "metrics")]
1647+
{
1648+
self.sweep_hand_advances += 1;
1649+
}
15991650
return Some((evicted.key, evicted.value));
16001651
}
16011652
self.advance_hand();
1653+
#[cfg(feature = "metrics")]
1654+
{
1655+
self.sweep_hand_advances += 1;
1656+
}
16021657
}
16031658
None
16041659
}

0 commit comments

Comments
 (0)