@@ -62,41 +62,6 @@ int64_t SaturatingMultiplyToInt64(uint64_t lhs, uint64_t rhs) {
6262 return static_cast <int64_t >(lhs * rhs);
6363}
6464
65- void AccumulateMrc (const RequestFact &fact, InstanceState &state) {
66- for (const auto &segment : fact.hit_curve ) {
67- if (segment.run_length == 0 ) {
68- continue ;
69- }
70- const uint64_t end_required_blocks = segment.start_required_blocks + segment.run_length - 1 ;
71- if (end_required_blocks + 1 >= state.mrc_interval_hit_count_deltas .size ()) {
72- state.mrc_interval_hit_count_deltas .resize (static_cast <std::size_t >(end_required_blocks + 2 ), 0 );
73- }
74- ++state.mrc_interval_hit_count_deltas [segment.start_required_blocks ];
75- --state.mrc_interval_hit_count_deltas [end_required_blocks + 1 ];
76- state.mrc_interval_total_hits += segment.run_length ;
77- }
78- }
79-
80- uint64_t ComputeMrcRequiredBlocks (const InstanceState &state) {
81- if (state.mrc_interval_total_hits == 0 ) {
82- return 0 ;
83- }
84-
85- // ceil(total * 0.95), written without multiplication to avoid overflow.
86- const uint64_t target_hits = state.mrc_interval_total_hits - state.mrc_interval_total_hits / 20 ;
87- uint64_t accumulated_hits = 0 ;
88- int64_t hits_at_required_blocks = 0 ;
89- for (std::size_t required_blocks = 0 ; required_blocks < state.mrc_interval_hit_count_deltas .size ();
90- ++required_blocks) {
91- hits_at_required_blocks += state.mrc_interval_hit_count_deltas [required_blocks];
92- accumulated_hits += static_cast <uint64_t >(hits_at_required_blocks);
93- if (accumulated_hits >= target_hits) {
94- return required_blocks;
95- }
96- }
97- return 0 ;
98- }
99-
10065} // namespace
10166
10267int64_t OnlineOptimizerManager::ComputeSizeForGroup (const std::vector<LocationSpecInfo> &specs,
@@ -529,7 +494,6 @@ ErrorCode OnlineOptimizerManager::TraceQuery(const std::string &instance_id,
529494 }
530495
531496 const RequestFact fact = state->lite_hit ->ProcessRequest (normalized.block_keys , replay_timestamp_ns);
532- AccumulateMrc (fact, *state);
533497 result.input_token_len = ClampToInt64 (normalized.input_token_len );
534498
535499 const uint64_t block_size = static_cast <uint64_t >(state->instance_info ->block_size ());
@@ -554,6 +518,7 @@ ErrorCode OnlineOptimizerManager::TraceQuery(const std::string &instance_id,
554518
555519 if (state->instance_group ->enable_theoretical_max_cache ()) {
556520 const uint64_t max_hits = HitCurveProjector::ProjectInfinite (fact);
521+ state->mrc_window .Record (fact);
557522 result.max_hit_count = ClampToInt64 (max_hits);
558523 result.max_hit_rate =
559524 normalized.input_token_len == 0 ? 0.0 : static_cast <double >(max_hits * block_size) / token_denominator;
@@ -737,21 +702,21 @@ ErrorCode OnlineOptimizerManager::ListInstances(const std::string &instance_grou
737702ErrorCode OnlineOptimizerManager::TakeMrcMetrics (std::vector<MrcMetricInfo> &metrics) {
738703 std::shared_lock lock (instances_mutex_);
739704 metrics.clear ();
740- metrics.reserve (instances_.size ());
741705
742706 for (const auto &[id, state] : instances_) {
743707 std::lock_guard<std::mutex> guard (state->mutex );
744- if (state->linear_step != 0 || !state->lite_hit ) {
708+ if (state->linear_step != 0 || !state->lite_hit || !state-> instance_group -> enable_theoretical_max_cache () ) {
745709 continue ;
746710 }
747711
748- MrcMetricInfo metric;
749- metric.instance_id = id;
750- metric.capacity_bytes =
751- SaturatingMultiplyToInt64 (ComputeMrcRequiredBlocks (*state), static_cast <uint64_t >(state->size_full ));
752- metrics.push_back (std::move (metric));
753- state->mrc_interval_hit_count_deltas .clear ();
754- state->mrc_interval_total_hits = 0 ;
712+ for (const auto &point : state->mrc_window .Take ()) {
713+ MrcMetricInfo metric;
714+ metric.instance_id = id;
715+ metric.target_basis_points = point.target_basis_points ;
716+ metric.capacity_bytes =
717+ SaturatingMultiplyToInt64 (point.required_blocks , static_cast <uint64_t >(state->size_full ));
718+ metrics.push_back (std::move (metric));
719+ }
755720 }
756721 return EC_OK ;
757722}
@@ -795,8 +760,7 @@ ErrorCode OnlineOptimizerManager::ResetStats(const std::string &instance_id) {
795760 state->total_input_tokens = 0 ;
796761 std::fill (state->total_hits_per_capacity .begin (), state->total_hits_per_capacity .end (), 0 );
797762 state->total_max_hits = 0 ;
798- state->mrc_interval_hit_count_deltas .clear ();
799- state->mrc_interval_total_hits = 0 ;
763+ state->mrc_window .Reset ();
800764 KVCM_LOG_INFO (" ResetStats OK: instance[%s]" , instance_id.c_str ());
801765 return EC_OK ;
802766}
0 commit comments