Skip to content

Commit 251c0cd

Browse files
pbhandar2meta-codesync[bot]
authored andcommitted
Add window stats to reuse reinsertion policy
Summary: On top of the current reinsertion rate, we also want some snapshots of reinsertion rates and bytes reinserted over a time window. Reviewed By: AlnisM Differential Revision: D86266076 fbshipit-source-id: ea50b0c716a12fdedfba5cf2f15a0757971cb506
1 parent d317365 commit 251c0cd

File tree

2 files changed

+75
-4
lines changed

2 files changed

+75
-4
lines changed

cachelib/navy/block_cache/ReuseTimeReinsertionPolicy.cpp

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ ReuseTimeReinsertionPolicy::ReuseTimeReinsertionPolicy(
4848

4949
bool ReuseTimeReinsertionPolicy::shouldReinsert(folly::StringPiece key,
5050
folly::StringPiece value) {
51+
updateRateWindow(); // check if window needs to be reset
5152
reinsertAttempts_.inc();
53+
attemptedBytes_.add(value.size());
54+
windowAttemptedCount_.fetch_add(1, std::memory_order_relaxed);
5255

5356
const auto lr = index_.peek(
5457
makeHK(cachelib::navy::BufferView{
@@ -70,6 +73,8 @@ bool ReuseTimeReinsertionPolicy::shouldReinsert(folly::StringPiece key,
7073
return false;
7174
}
7275
reinserted_.inc();
76+
windowReinsertedCount_.fetch_add(1, std::memory_order_relaxed);
77+
windowReinsertedBytes_.fetch_add(value.size(), std::memory_order_relaxed);
7378
reinsertedBytes_.add(value.size());
7479
return true;
7580
}
@@ -80,16 +85,19 @@ void ReuseTimeReinsertionPolicy::onLookup(folly::StringPiece key) {
8085

8186
void ReuseTimeReinsertionPolicy::getCounters(
8287
const util::CounterVisitor& visitor) const {
83-
visitor("bc_reinsert_reuse_time_attempts",
88+
visitor("bc_reinsert_reuse_time_attempted",
8489
reinsertAttempts_.get(),
8590
cachelib::util::CounterVisitor::CounterType::RATE);
91+
visitor("bc_reinsert_reuse_time_attempted_bytes",
92+
attemptedBytes_.get(),
93+
cachelib::util::CounterVisitor::CounterType::RATE);
8694
visitor("bc_reinsert_reuse_time_key_not_found",
8795
keyNotFound_.get(),
8896
cachelib::util::CounterVisitor::CounterType::RATE);
89-
visitor("bc_reinsert_reuse_time_success",
97+
visitor("bc_reinsert_reuse_time_accepted",
9098
reinserted_.get(),
9199
cachelib::util::CounterVisitor::CounterType::RATE);
92-
visitor("bc_reinsert_reuse_time_success_bytes",
100+
visitor("bc_reinsert_reuse_time_accepted_bytes",
93101
reinsertedBytes_.get(),
94102
cachelib::util::CounterVisitor::CounterType::RATE);
95103
visitor("bc_reinsert_expired",
@@ -98,7 +106,24 @@ void ReuseTimeReinsertionPolicy::getCounters(
98106
visitor("bc_reinsert_no_prev_access",
99107
noPrevAccess_.get(),
100108
cachelib::util::CounterVisitor::CounterType::RATE);
101-
// Report percentile stats for reuse time values
109+
110+
visitor("bc_reinsert_last_byte_accepted",
111+
lastBytesAccepted_.load(std::memory_order_relaxed),
112+
cachelib::util::CounterVisitor::CounterType::COUNT);
113+
114+
visitor("bc_reinsert_last_acceptance_rate",
115+
lastAcceptanceRate_.load(std::memory_order_relaxed),
116+
cachelib::util::CounterVisitor::CounterType::COUNT);
117+
118+
auto attempts = reinsertAttempts_.get();
119+
double acceptanceRate = attempts > 0
120+
? static_cast<double>(reinserted_.get()) /
121+
static_cast<double>(attempts)
122+
: 0.0;
123+
visitor("bc_reinsert_acceptance_rate",
124+
acceptanceRate,
125+
cachelib::util::CounterVisitor::CounterType::COUNT);
126+
102127
reuseTimeStats_.visitQuantileEstimator(visitor, "bc_reinsert_reuse_time");
103128
}
104129

@@ -175,4 +200,38 @@ uint32_t ReuseTimeReinsertionPolicy::isExpired(folly::StringPiece value) {
175200
return nvmItem.isExpired();
176201
}
177202

203+
void ReuseTimeReinsertionPolicy::updateRateWindow() const {
204+
auto currentTime = static_cast<uint64_t>(
205+
std::chrono::duration_cast<std::chrono::milliseconds>(
206+
std::chrono::steady_clock::now().time_since_epoch())
207+
.count());
208+
209+
auto windowStart = windowStartTime_.load(std::memory_order_relaxed);
210+
// Initialize windowStartTime_ on first call
211+
if (windowStart == 0) {
212+
windowStartTime_.store(currentTime, std::memory_order_relaxed);
213+
return;
214+
}
215+
216+
auto elapsed = currentTime - windowStart;
217+
if (elapsed >= windowSizeMs_) {
218+
// Try to rotate the window (only one thread should succeed)
219+
if (windowStartTime_.compare_exchange_strong(
220+
windowStart, currentTime, std::memory_order_relaxed)) {
221+
// Atomically read and reset counters to avoid losing increments
222+
// from concurrent threads
223+
auto attempts =
224+
windowAttemptedCount_.exchange(0, std::memory_order_relaxed);
225+
auto reinserted =
226+
windowReinsertedCount_.exchange(0, std::memory_order_relaxed);
227+
auto reinsertedBytes =
228+
windowReinsertedBytes_.exchange(0, std::memory_order_relaxed);
229+
double rate =
230+
attempts > 0 ? static_cast<double>(reinserted) / attempts : 0.0;
231+
lastAcceptanceRate_.store(rate, std::memory_order_relaxed);
232+
lastBytesAccepted_.store(reinsertedBytes, std::memory_order_relaxed);
233+
}
234+
}
235+
}
236+
178237
} // namespace facebook::cachelib::navy

cachelib/navy/block_cache/ReuseTimeReinsertionPolicy.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,28 @@ class ReuseTimeReinsertionPolicy : public BlockCacheReinsertionPolicy {
6969
const cachelib::navy::Index& index_;
7070
size_t numBuckets_{0};
7171
size_t bucketSize_{0};
72+
size_t windowSizeMs_{1000}; // 1 second default
7273

7374
std::unique_ptr<AccessTracker> tracker_;
7475
AtomicCounter reinsertAttempts_{0};
76+
AtomicCounter attemptedBytes_{0};
7577
AtomicCounter keyNotFound_{0};
7678
AtomicCounter expired_{0};
7779
AtomicCounter reinserted_{0};
7880
AtomicCounter reinsertedBytes_{0};
7981
AtomicCounter noPrevAccess_{0};
8082
mutable util::PercentileStats reuseTimeStats_;
8183

84+
// Counters for tracking reinsertion rate within the window
85+
mutable std::atomic<uint64_t> windowAttemptedCount_{0};
86+
mutable std::atomic<uint64_t> windowReinsertedCount_{0};
87+
mutable std::atomic<uint64_t> windowReinsertedBytes_{0};
88+
mutable std::atomic<uint64_t> windowStartTime_{0};
89+
mutable std::atomic<double> lastAcceptanceRate_{0.0};
90+
mutable std::atomic<uint64_t> lastBytesAccepted_{0};
91+
92+
void updateRateWindow() const;
93+
8294
friend class tests::ReuseTimeReinsertionPolicyTest_ReuseTimeComputation_Test;
8395
friend class tests::
8496
ReuseTimeReinsertionPolicyTest_PrevAccessBucketTracking_Test;

0 commit comments

Comments
 (0)