From 0aa9ba406bcfe2ce4a8d8da8570df3a92b7f540e Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sat, 31 May 2025 10:18:17 +0530 Subject: [PATCH 01/18] Adds draft proposal for slow start config Signed-off-by: anurag.ag --- A123_graphics/aggression_scaling.png | Bin 0 -> 149844 bytes ...nt-side-weighted-round-robin-slow-start.md | 241 ++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 A123_graphics/aggression_scaling.png create mode 100644 client-side-weighted-round-robin-slow-start.md diff --git a/A123_graphics/aggression_scaling.png b/A123_graphics/aggression_scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..f7493305168b81a53248ef2ea78797ede1d8e56f GIT binary patch literal 149844 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

_5%n!m3({EdE&QF~ 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 1.0) or more conservative approaches (values < 1.0). + +When an endpoint is not in the warmup period, the scale factor is set to 1.0, meaning the original weight is used without modification. This ensures that the slow start mechanism only affects endpoints during their initial warmup phase, after which they participate in normal load balancing based on their actual performance metrics. + +### Blackout Period vs Slow Start + +The WRR load balancing policy offers two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. + +The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report. During this period, the endpoint continues to receive traffic, but instead of using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the weights used are based on stable, continuous load reporting. + +The slow start period also begins when the endpoint receives its first non-zero load report and applies a gradual scaling factor to the weights over a configurable duration (default 30 seconds). This scaling is applied to whatever weight is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout period). The slow start period operates independently of the blackout period, meaning it will continue to scale the weights regardless of whether the blackout period is still active or has ended. + +It is recommended to keep the blackout period shorter than the slow start period. This is because when the blackout period ends, the endpoint's weight will suddenly change from the mean weight to its actual backend-reported weight. If this weight is significantly higher than the mean (e.g., 2x the mean weight), it could cause a sudden traffic spike that defeats the purpose of gradual traffic increase. By having a longer slow start period, the scaling factor will continue to gradually increase the weight even after the blackout period ends, ensuring a smooth transition to the full backend-reported weight. + +When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. However, when new weights arrive after expiration, the endpoint will enter the blackout period again, and if slow start is configured, the weights will be scaled up gradually during this period. + +These mechanisms can be configured in different ways: +- Using only blackout period: Ensures stable weight reporting by using mean weights before switching to backend weights +- Using only slow start: Allows immediate use of backend weights but scales them gradually +- Using both: Provides both stable weight reporting and gradual scaling + - The slow start period will scale the mean weights during blackout period + - After blackout period ends, it will continue to scale the actual backend-reported weights + +This flexible design allows operators to tune the behavior based on their specific needs, whether they want to prioritize stable weight reporting, faster weight adoption, or gradual traffic ramp-up. + +### Example Implementation + +```pseudo +// Configuration parameters +slow_start_window: Duration +min_weight_percent: float +aggression: float + +// State +non_empty_since: Time // Time when first non-zero load report was received + +function get_scale() -> float: + time_elapsed_since_start = current_time - non_empty_since + if time_elapsed_since_start >= slow_start_window: + return 1.0 + + time_factor = max(time_elapsed_since_start, 1.0) / slow_start_window + min_scale = min_weight_percent / 100.0 + + // Apply non-linear scaling based on aggression factor + scale = max(min_scale, time_factor ^ (1.0 / aggression)) + return scale + +function get_final_weight(endpoint_weight: float, scaling_factor: float) -> float: + // endpoint_weight is either: + // - mean_weight for stale endpoints or endpoints in blackout period + // - actual backend-reported weight after blackout period + return endpoint_weight * scaling_factor +``` + +### xDS Integration + +The slow start configuration will be added to the xDS proto for the weighted round robin policy: + +```textproto +package envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3; + +message ClientSideWeightedRoundRobin { + // ... existing fields ... + cluster.v3.Cluster.SlowStartConfig slow_start_config = 8; +} + +message SlowStartConfig { + google.protobuf.Duration slow_start_window = 1; + core.v3.RuntimeDouble aggression = 2; + type.v3.Percent min_weight_percent = 3; +} +``` + +## Rationale + +The slow start feature helps prevent overwhelming new endpoints by gradually increasing their traffic load. This is particularly important in systems where endpoints need time to: +- Warm up their caches +- Establish connections to downstream services +- Initialize internal state +- Build up connection pools + +By scaling the weights during the warmup period, we allow new endpoints to handle a smaller portion of traffic initially, reducing the risk of errors and high latency during the critical warmup phase. + +### Effectiveness Considerations + +The slow start feature is most effective in scenarios where: +- Few new endpoints are added at a time (e.g., scale events in Kubernetes) +- Endpoints need time to warm up caches or establish connections +- The system has sufficient traffic to gradually increase load + +The feature may be less effective when: +- All endpoints are relatively new (e.g., new deployment in Kubernetes) +- The system has low traffic volume +- There are many endpoints in the cluster + +In these cases, the slow start feature may lead to: +- Endpoint starvation (low probability of receiving requests) +- Non-gradual traffic increases when requests do arrive +- Reduced effectiveness of the load balancing algorithm + +## Metrics + +The following metric will be exposed to help monitor the slow start behavior: + +`grpc.lb.wrr.endpoints_in_slow_start` +- Type: Gauge +- Description: Number of endpoints currently in slow start period +- Labels: + - `grpc.lb.locality`: The locality of the endpoints + - `grpc.lb.backend_service`: The backend service name + +This metric will help operators monitor the number of endpoints currently in slow start mode across different localities and backend services. + +## Implementation + +This will be implemented in all languages C++, Java, and Go. + +## References + +1. [Envoy Slow Start Documentation](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start) +2. [gRFC A58][A58] - Client-side weighted round robin LB policy \ No newline at end of file From 65c3c6d1793873087d39b3f4923ffa8c373a18ce Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sat, 31 May 2025 10:32:03 +0530 Subject: [PATCH 02/18] Deletes example Signed-off-by: anurag.ag --- client-side-weighted-round-robin-slow-start.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/client-side-weighted-round-robin-slow-start.md b/client-side-weighted-round-robin-slow-start.md index ca2ec0c45..01600946f 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/client-side-weighted-round-robin-slow-start.md @@ -20,7 +20,7 @@ However, the current WRR implementation lacks support for any ramp-up or warm-up In contrast, many modern systems adopt slow start strategies in load balancing to address these issues. These strategies allow endpoints to ramp up traffic gradually over a defined window, smoothing transitions and mitigating the risks of traffic spikes. Similar functionality exists in Envoy's load balancing policies, where slow start is implemented for round robin and least request policies. -Introducing a slow_start_config configuration in gRPC WRR will offer these benefits within the native client policy, reducing reliance on external traffic-shaping mechanisms or manual intervention. +Introducing a `slow_start_config` configuration in gRPC WRR will offer these benefits within the native client policy, reducing reliance on external traffic-shaping mechanisms or manual intervention. ### Related Proposals: * [gRFC A58][A58] - Client-side weighted round robin LB policy @@ -85,11 +85,6 @@ time_factor = max(time_since_start_in_seconds, 1) / slow_start_window_seconds scale = max(min_weight_percent, time_factor ^ (1/aggression)) ``` -For example, with default values (min_weight_percent = 10%, aggression = 1.0): -- At t=0s: scale = 0.1 -- At t=15s: scale = 0.55 -- At t=30s: scale = 1.0 - The following image shows how different aggression values affect the scaling factor over time during the slow start window (in milliseconds): ![Effect of aggression parameter on slow start scaling](A123_graphics/aggression_scaling.png) From c63fe59d41a8bbeb07c01bcc5887389e3c1d20af Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sat, 31 May 2025 10:35:02 +0530 Subject: [PATCH 03/18] Linking proposal Signed-off-by: anurag.ag --- client-side-weighted-round-robin-slow-start.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client-side-weighted-round-robin-slow-start.md b/client-side-weighted-round-robin-slow-start.md index 01600946f..abe4a2e1a 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/client-side-weighted-round-robin-slow-start.md @@ -25,6 +25,8 @@ Introducing a `slow_start_config` configuration in gRPC WRR will offer these ben ### Related Proposals: * [gRFC A58][A58] - Client-side weighted round robin LB policy +[A58]: A58-client-side-weighted-round-robin-lb-policy.md + ## Proposal Add slow start configuration to the `weighted_round_robin` load balancing policy. The slow start feature will scale the computed weights for endpoints during their warmup period, gradually increasing the traffic they receive. From a4a2bbbd6586bcc2d2892ebf389451d586c3c196 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sat, 31 May 2025 10:36:52 +0530 Subject: [PATCH 04/18] Linking user Signed-off-by: anurag.ag --- client-side-weighted-round-robin-slow-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-side-weighted-round-robin-slow-start.md b/client-side-weighted-round-robin-slow-start.md index abe4a2e1a..d83bb617d 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/client-side-weighted-round-robin-slow-start.md @@ -1,6 +1,6 @@ Client-side weighted round robin slow start configuration ---- -* Author(s): Anurag Agarwal (@anuragagarwal561994) +* Author(s): [Anurag Agarwal](https://github.com/anuragagarwal561994) * Approver: a11r * Status: Draft * Last updated: 2025-05-31 From 1f39fe7957d23455c7187cc50da7c27e7ed005b8 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Mon, 16 Jun 2025 13:58:08 +0530 Subject: [PATCH 05/18] Adds scopes and limitation section Signed-off-by: anurag.ag --- client-side-weighted-round-robin-slow-start.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client-side-weighted-round-robin-slow-start.md b/client-side-weighted-round-robin-slow-start.md index d83bb617d..b0a0ac1d2 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/client-side-weighted-round-robin-slow-start.md @@ -215,6 +215,16 @@ In these cases, the slow start feature may lead to: - Non-gradual traffic increases when requests do arrive - Reduced effectiveness of the load balancing algorithm +## Scope and Limitations + +This proposal specifically focuses on implementing slow start for the weighted round robin load balancing policy. While similar slow start functionality could potentially be implemented for other load balancing algorithms like Round Robin and Least Request, these are not included in this proposal for the following reasons: + +1. These algorithms don't use weights to determine endpoint selection, making the implementation of slow start more complex +2. Additional considerations would be needed for how to gradually increase traffic to new endpoints in these algorithms +3. The implementation details would likely differ significantly from the weighted round robin approach + +These other load balancing algorithms can be considered for slow start implementation in future proposals, with their own specific design considerations and requirements. + ## Metrics The following metric will be exposed to help monitor the slow start behavior: From 8bb3da069134c2659c6f0938b7edc88de984e153 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Mon, 16 Jun 2025 14:07:31 +0530 Subject: [PATCH 06/18] Remove dependency from xds proto Signed-off-by: anurag.ag --- client-side-weighted-round-robin-slow-start.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client-side-weighted-round-robin-slow-start.md b/client-side-weighted-round-robin-slow-start.md index b0a0ac1d2..0a31ce00c 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/client-side-weighted-round-robin-slow-start.md @@ -67,12 +67,12 @@ message SlowStartConfig { // // As time progresses, more and more traffic would be sent to endpoint, which is in slow start window. // Once host exits slow start, time_factor and aggression no longer affect its weight. - core.v3.RuntimeDouble aggression = 2; + google.protobuf.FloatValue aggression = 2; // Configures the minimum percentage of origin weight that avoids too small new weight, // which may cause endpoints in slow start mode receive no traffic in slow start window. // If not specified, the default is 10%. - type.v3.Percent min_weight_percent = 3; + google.protobuf.UInt32Value min_weight_percent = 3; } ``` From 0b603ded45dfd1ff64ab3439fb91881df75b8f3e Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Tue, 1 Jul 2025 18:00:34 +0530 Subject: [PATCH 07/18] Updates proposal number to A100 Signed-off-by: anurag.ag --- ...0-client-side-weighted-round-robin-slow-start.md | 2 +- .../aggression_scaling.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename client-side-weighted-round-robin-slow-start.md => A100-client-side-weighted-round-robin-slow-start.md (99%) rename {A123_graphics => A100_graphics}/aggression_scaling.png (100%) diff --git a/client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md similarity index 99% rename from client-side-weighted-round-robin-slow-start.md rename to A100-client-side-weighted-round-robin-slow-start.md index 0a31ce00c..a022dd38f 100644 --- a/client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -1,4 +1,4 @@ -Client-side weighted round robin slow start configuration +A100: Client-side weighted round robin slow start configuration ---- * Author(s): [Anurag Agarwal](https://github.com/anuragagarwal561994) * Approver: a11r diff --git a/A123_graphics/aggression_scaling.png b/A100_graphics/aggression_scaling.png similarity index 100% rename from A123_graphics/aggression_scaling.png rename to A100_graphics/aggression_scaling.png From 6ce237e24d5b64a07acbc1a6858e2bfe844076e9 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Tue, 1 Jul 2025 18:16:24 +0530 Subject: [PATCH 08/18] Updates references Signed-off-by: anurag.ag --- ...lient-side-weighted-round-robin-slow-start.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index a022dd38f..051a9a49c 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -10,7 +10,7 @@ A100: Client-side weighted round robin slow start configuration This proposal introduces an enhancement to the existing client-side weighted_round_robin (WRR) load balancing policy in gRPC by incorporating a configurable `slow_start_config` mechanism. The intent of this feature is to gradually increase traffic to backend endpoints that are newly introduced or have recently rejoined the cluster, allowing them time to warm up and reach their optimal performance level before handling their full share of traffic. This change increases system stability and resilience in environments with dynamic scaling and volatile workloads. -The design borrows from production-ready practices in other load balancers such as Envoy, where gradual traffic ramp-up (slow start) is a well-established technique for avoiding performance degradation and request failures during backend startup or recovery. The slow start feature gradually increases the traffic sent to newly added endpoints during a warmup period, allowing them to warm up their caches and establish connections before receiving full traffic load. +The design borrows from production-ready practices in other load balancers such as Envoy, where gradual traffic ramp-up (slow start) is a [well-established technique][Envoy Slow Start Documentation] for avoiding performance degradation and request failures during backend startup or recovery. The slow start feature gradually increases the traffic sent to newly added endpoints during a warmup period, allowing them to warm up their caches and establish connections before receiving full traffic load. ## Background @@ -23,9 +23,7 @@ In contrast, many modern systems adopt slow start strategies in load balancing t Introducing a `slow_start_config` configuration in gRPC WRR will offer these benefits within the native client policy, reducing reliance on external traffic-shaping mechanisms or manual intervention. ### Related Proposals: -* [gRFC A58][A58] - Client-side weighted round robin LB policy - -[A58]: A58-client-side-weighted-round-robin-lb-policy.md +* [gRFC A58: weighted_round_robin LB policy][A58] ## Proposal @@ -59,7 +57,7 @@ message SlowStartConfig { // so that endpoint would get linearly increasing amount of traffic. // When increasing the value for this parameter, the speed of traffic ramp-up increases non-linearly. // The value of aggression parameter should be greater than 0.0. - // By tuning the parameter, is possible to achieve polynomial or exponential shape of ramp-up curve. + // By tuning the parameter, it is possible to achieve polynomial or exponential shape of ramp-up curve. // // During slow start window, effective weight of an endpoint would be scaled with time factor and aggression: // ``new_weight = weight * max(min_weight_percent, time_factor ^ (1 / aggression))``, @@ -78,7 +76,7 @@ message SlowStartConfig { ### Weight Scaling During Warmup -When an endpoint is first added or becomes ready after being in a non-ready state, it enters the warmup period. During this period, its weight will be scaled by a factor that increases non-linearly from `min_weight_percent` to 100% over the duration of `slow_start_window`. +When an endpoint is ready after being in a non-ready state, it enters the warmup period. During this period, its weight will be scaled by a factor that increases non-linearly from `min_weight_percent` to 100% over the duration of `slow_start_window`. The scale factor is calculated as follows: @@ -242,7 +240,5 @@ This metric will help operators monitor the number of endpoints currently in slo This will be implemented in all languages C++, Java, and Go. -## References - -1. [Envoy Slow Start Documentation](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start) -2. [gRFC A58][A58] - Client-side weighted round robin LB policy \ No newline at end of file +[Envoy Slow Start Documentation]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start +[A58]: A58-client-side-weighted-round-robin-lb-policy.md \ No newline at end of file From c0f6592e766ca623be9ddf37a6b1354d9da22be5 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Wed, 2 Jul 2025 20:00:24 +0530 Subject: [PATCH 09/18] Updates proposal to include ready_since timestamp Signed-off-by: anurag.ag --- ...nt-side-weighted-round-robin-slow-start.md | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index 051a9a49c..111169a7f 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -81,7 +81,7 @@ When an endpoint is ready after being in a non-ready state, it enters the warmup The scale factor is calculated as follows: ``` -time_factor = max(time_since_start_in_seconds, 1) / slow_start_window_seconds +time_factor = max(time_since_ready_in_seconds, 1) / slow_start_window_seconds scale = max(min_weight_percent, time_factor ^ (1/aggression)) ``` @@ -98,7 +98,9 @@ final_weight = computed_weight * scale ### Subchannel Weights -The existing `non_empty_since` timestamp, which is already used to check for `blackout_period`, can be repurposed to track the start of the warmup period for each endpoint. This timestamp tracks when the first non-zero load report was received, marking the beginning of its warmup period. This approach eliminates the need for additional timestamp tracking while maintaining the existing functionality. +To maintain independence between the blackout period and slow start period, a new timestamp `ready_since` will be introduced to track when an endpoint transitioned to ready state. This timestamp is separate from the existing `non_empty_since` timestamp used for the blackout period. + +The `ready_since` timestamp is set when an endpoint transitions from a non-ready state (e.g., CONNECTING, TRANSIENT_FAILURE) to a ready state (READY). This marks the beginning of the slow start period for that endpoint. The existing `non_empty_since` timestamp continues to be used exclusively for tracking the blackout period, which begins when the first non-zero load report is received. Weight calculation in the WRR policy follows a two-step process. First, the base weight for each endpoint is computed using the formula from [gRFC A58][A58]: @@ -110,7 +112,7 @@ $$scaled\\_weight = weight * max(min\\_weight\\_percent, time\\_factor ^ {1/aggr where, -$$time\\_factor = \dfrac{max(time\\_since\\_non\\_empty\\_seconds, 1)}{slow\\_start\\_window\\_seconds}$$ +$$time\\_factor = \dfrac{max(time\\_since\\_ready\\_seconds, 1)}{slow\\_start\\_window\\_seconds}$$ The scaling formula ensures that new endpoints receive a gradually increasing share of traffic while maintaining a minimum threshold to prevent starvation. The `aggression` parameter allows fine-tuning of the ramp-up curve, enabling either more aggressive initial scaling (values > 1.0) or more conservative approaches (values < 1.0). @@ -118,15 +120,20 @@ When an endpoint is not in the warmup period, the scale factor is set to 1.0, me ### Blackout Period vs Slow Start -The WRR load balancing policy offers two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. +The WRR load balancing policy will offers two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. + +The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report (tracked by `non_empty_since` timestamp). During this period, the endpoint continues to receive traffic, but instead of using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the weights used are based on stable, continuous load reporting. -The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report. During this period, the endpoint continues to receive traffic, but instead of using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the weights used are based on stable, continuous load reporting. +The slow start period begins when an endpoint transitions to ready state (tracked by `ready_since` timestamp) and applies a gradual scaling factor to the weights over a configurable duration. This scaling is applied to whatever weight is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout period). The slow start period operates independently of the blackout period, meaning it will continue to scale the weights regardless of whether the blackout period is still active or has ended. -The slow start period also begins when the endpoint receives its first non-zero load report and applies a gradual scaling factor to the weights over a configurable duration (default 30 seconds). This scaling is applied to whatever weight is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout period). The slow start period operates independently of the blackout period, meaning it will continue to scale the weights regardless of whether the blackout period is still active or has ended. +The independence of these mechanisms allows for more flexible configurations: +- Slow start can begin immediately when an endpoint becomes ready, even before any load reports are received +- The blackout period can continue to function as designed for weight stability, regardless of the slow start configuration +- Both mechanisms can be tuned independently based on specific operational requirements It is recommended to keep the blackout period shorter than the slow start period. This is because when the blackout period ends, the endpoint's weight will suddenly change from the mean weight to its actual backend-reported weight. If this weight is significantly higher than the mean (e.g., 2x the mean weight), it could cause a sudden traffic spike that defeats the purpose of gradual traffic increase. By having a longer slow start period, the scaling factor will continue to gradually increase the weight even after the blackout period ends, ensuring a smooth transition to the full backend-reported weight. -When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. However, when new weights arrive after expiration, the endpoint will enter the blackout period again, and if slow start is configured, the weights will be scaled up gradually during this period. +When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. When new weights arrive after expiration, the endpoint will enter the blackout period again but not the slow start since there was no transition of sub-channel state and no gradullay traffic increase should ideally be expected here. These mechanisms can be configured in different ways: - Using only blackout period: Ensures stable weight reporting by using mean weights before switching to backend weights @@ -146,14 +153,15 @@ min_weight_percent: float aggression: float // State -non_empty_since: Time // Time when first non-zero load report was received +non_empty_since: Time // Time when first non-zero load report was received (for blackout period) +ready_since: Time // Time when endpoint transitioned to ready state (for slow start period) function get_scale() -> float: - time_elapsed_since_start = current_time - non_empty_since - if time_elapsed_since_start >= slow_start_window: + time_elapsed_since_ready = current_time - ready_since + if time_elapsed_since_ready >= slow_start_window: return 1.0 - time_factor = max(time_elapsed_since_start, 1.0) / slow_start_window + time_factor = max(time_elapsed_since_ready, 1.0) / slow_start_window min_scale = min_weight_percent / 100.0 // Apply non-linear scaling based on aggression factor From 3de4cfcd83e0be4462c167033b39e025959ee382 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Thu, 3 Jul 2025 00:39:01 +0530 Subject: [PATCH 10/18] Adds Java Implementation Signed-off-by: anurag.ag --- A100-client-side-weighted-round-robin-slow-start.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index 111169a7f..76634dd76 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -246,7 +246,9 @@ This metric will help operators monitor the number of endpoints currently in slo ## Implementation -This will be implemented in all languages C++, Java, and Go. +The functionality is being implemented in Java. It will be implemented in Go, C++ in the near future. + +Java Implementation: https://github.com/grpc/grpc-java/pull/12200 [Envoy Slow Start Documentation]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start [A58]: A58-client-side-weighted-round-robin-lb-policy.md \ No newline at end of file From ed6c9a7c6e113ba8922d7b89647e41e74b3ed21d Mon Sep 17 00:00:00 2001 From: Anurag Agarwal Date: Thu, 17 Jul 2025 18:13:48 +0530 Subject: [PATCH 11/18] Fix typo, making offers as offer Co-authored-by: Antoine Tollenaere --- A100-client-side-weighted-round-robin-slow-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index 76634dd76..4de655ce0 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -120,7 +120,7 @@ When an endpoint is not in the warmup period, the scale factor is set to 1.0, me ### Blackout Period vs Slow Start -The WRR load balancing policy will offers two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. +The WRR load balancing policy will offer two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report (tracked by `non_empty_since` timestamp). During this period, the endpoint continues to receive traffic, but instead of using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the weights used are based on stable, continuous load reporting. From d92cf99c75ddd5860771b045aeda24bd6c02f48f Mon Sep 17 00:00:00 2001 From: Anurag Agarwal Date: Fri, 18 Jul 2025 11:36:54 +0530 Subject: [PATCH 12/18] Apply suggestions from code review Co-authored-by: Doug Fawley --- A100-client-side-weighted-round-robin-slow-start.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index 4de655ce0..d628d977e 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -67,9 +67,9 @@ message SlowStartConfig { // Once host exits slow start, time_factor and aggression no longer affect its weight. google.protobuf.FloatValue aggression = 2; - // Configures the minimum percentage of origin weight that avoids too small new weight, - // which may cause endpoints in slow start mode receive no traffic in slow start window. - // If not specified, the default is 10%. + // Configures the minimum percentage of the original weight that will be used for an endpoint + // in slow start. This helps to avoid a scenario in which endpoints receive no traffic during the + // slow start window. Must be between 0 and 100. If not specified, the default is 10%. google.protobuf.UInt32Value min_weight_percent = 3; } ``` @@ -82,7 +82,7 @@ The scale factor is calculated as follows: ``` time_factor = max(time_since_ready_in_seconds, 1) / slow_start_window_seconds -scale = max(min_weight_percent, time_factor ^ (1/aggression)) +scale = max(min_weight_percent/100, time_factor ^ (1/aggression)) ``` The following image shows how different aggression values affect the scaling factor over time during the slow start window (in milliseconds): @@ -133,7 +133,7 @@ The independence of these mechanisms allows for more flexible configurations: It is recommended to keep the blackout period shorter than the slow start period. This is because when the blackout period ends, the endpoint's weight will suddenly change from the mean weight to its actual backend-reported weight. If this weight is significantly higher than the mean (e.g., 2x the mean weight), it could cause a sudden traffic spike that defeats the purpose of gradual traffic increase. By having a longer slow start period, the scaling factor will continue to gradually increase the weight even after the blackout period ends, ensuring a smooth transition to the full backend-reported weight. -When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. When new weights arrive after expiration, the endpoint will enter the blackout period again but not the slow start since there was no transition of sub-channel state and no gradullay traffic increase should ideally be expected here. +When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. When new weights arrive after expiration, the endpoint will enter the blackout period again but not the slow start since there was no transition of sub-channel state and no gradual traffic increase should be expected. These mechanisms can be configured in different ways: - Using only blackout period: Ensures stable weight reporting by using mean weights before switching to backend weights From 15247c979020434f4935859857f1f5f0a73b9887 Mon Sep 17 00:00:00 2001 From: Anurag Agarwal Date: Fri, 18 Jul 2025 11:37:44 +0530 Subject: [PATCH 13/18] Fixes min_weight_percent nit --- A100-client-side-weighted-round-robin-slow-start.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index d628d977e..fcfdef207 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -60,7 +60,7 @@ message SlowStartConfig { // By tuning the parameter, it is possible to achieve polynomial or exponential shape of ramp-up curve. // // During slow start window, effective weight of an endpoint would be scaled with time factor and aggression: - // ``new_weight = weight * max(min_weight_percent, time_factor ^ (1 / aggression))``, + // ``new_weight = weight * max(min_weight_percent / 100, time_factor ^ (1 / aggression))``, // where ``time_factor=(time_since_start_seconds / slow_start_time_seconds)``. // // As time progresses, more and more traffic would be sent to endpoint, which is in slow start window. @@ -251,4 +251,4 @@ The functionality is being implemented in Java. It will be implemented in Go, C+ Java Implementation: https://github.com/grpc/grpc-java/pull/12200 [Envoy Slow Start Documentation]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start -[A58]: A58-client-side-weighted-round-robin-lb-policy.md \ No newline at end of file +[A58]: A58-client-side-weighted-round-robin-lb-policy.md From 1d363cd03c5e9d39941154d9128d0efa9820f6dd Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sun, 20 Jul 2025 16:05:54 +0530 Subject: [PATCH 14/18] Updates proposal with slow start metrics and related references Signed-off-by: anurag.ag --- ...nt-side-weighted-round-robin-slow-start.md | 210 ++++++++++++------ ...ent-side-weighted-round-robin-lb-policy.md | 1 + 2 files changed, 138 insertions(+), 73 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index fcfdef207..b90d06406 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -1,33 +1,59 @@ A100: Client-side weighted round robin slow start configuration ---- + * Author(s): [Anurag Agarwal](https://github.com/anuragagarwal561994) -* Approver: a11r +* Approver: Mark Roth (@markdroth), Eric Anderson (@ejona86), Doug Fawley (@dfawley) * Status: Draft * Last updated: 2025-05-31 * Discussion at: TBD ## Abstract -This proposal introduces an enhancement to the existing client-side weighted_round_robin (WRR) load balancing policy in gRPC by incorporating a configurable `slow_start_config` mechanism. The intent of this feature is to gradually increase traffic to backend endpoints that are newly introduced or have recently rejoined the cluster, allowing them time to warm up and reach their optimal performance level before handling their full share of traffic. This change increases system stability and resilience in environments with dynamic scaling and volatile workloads. +This proposal introduces an enhancement to the existing client-side weighted_round_robin (WRR) load balancing policy in +gRPC by incorporating a configurable `slow_start_config` mechanism. The intent of this feature is to gradually increase +traffic to backend endpoints that are newly introduced or have recently rejoined the cluster, allowing them time to warm +up and reach their optimal performance level before handling their full share of traffic. This change increases system +stability and resilience in environments with dynamic scaling and volatile workloads. -The design borrows from production-ready practices in other load balancers such as Envoy, where gradual traffic ramp-up (slow start) is a [well-established technique][Envoy Slow Start Documentation] for avoiding performance degradation and request failures during backend startup or recovery. The slow start feature gradually increases the traffic sent to newly added endpoints during a warmup period, allowing them to warm up their caches and establish connections before receiving full traffic load. +The design borrows from production-ready practices in other data plances such as Envoy, where gradual traffic ramp-up ( +slow start) is a [well-established technique][Envoy Slow Start Documentation] for avoiding performance degradation and +request failures during backend startup or recovery. The slow start feature gradually increases the traffic sent to +newly added endpoints during a warmup period, allowing them to warm up their caches and establish connections before +receiving full traffic load. ## Background -gRPC's WRR load balancing policy allows clients to route requests to backend endpoints in proportion to assigned weights. These weights are usually derived from backend metrics, such as CPU usage, QPS, and error rates published by the backend servers. This allows gRPC clients to adapt traffic distribution dynamically based on backend capacity. +gRPC's WRR load balancing policy allows clients to route requests to backend endpoints in proportion to assigned +weights. These weights are usually derived from backend metrics, such as CPU usage, QPS, and error rates published by +the backend servers. This allows gRPC clients to adapt traffic distribution dynamically based on backend capacity. -However, the current WRR implementation lacks support for any ramp-up or warm-up phase. When a new endpoint appears—either due to autoscaling, replacement, or recovery from a failure—the client immediately starts routing requests based on the full weight reported for that endpoint. This can result in overloading the endpoint before it is fully initialized, negatively impacting response times and service reliability. It is especially problematic for systems with cold caches, JIT compilation warm-up delays, or dependency initialization steps. +The current WRR implementation has a blackout period mechanism that provides some warm-up functionality, but it's not +sufficient for all cases, as described in detail below. When a new endpoint appears—either due to autoscaling, +replacement, or recovery from a failure—the client still routes traffic to it based on weights that may not account for +its initialization state. This can result in overloading the endpoint before it is fully initialized, negatively +impacting response times and service reliability. It is especially problematic for systems with cold caches, JIT +compilation warm-up delays, or dependency initialization steps. -In contrast, many modern systems adopt slow start strategies in load balancing to address these issues. These strategies allow endpoints to ramp up traffic gradually over a defined window, smoothing transitions and mitigating the risks of traffic spikes. Similar functionality exists in Envoy's load balancing policies, where slow start is implemented for round robin and least request policies. +In contrast, many modern systems adopt slow start strategies in load balancing to address these issues. These strategies +allow endpoints to ramp up traffic gradually over a defined window, smoothing transitions and mitigating the risks of +traffic spikes. Similar functionality exists in Envoy's load balancing policies, where slow start is implemented for +round robin and least request policies. -Introducing a `slow_start_config` configuration in gRPC WRR will offer these benefits within the native client policy, reducing reliance on external traffic-shaping mechanisms or manual intervention. +Introducing a `slow_start_config` configuration in gRPC WRR will offer these benefits within the native client policy, +reducing reliance on external traffic-shaping mechanisms or manual intervention. ### Related Proposals: -* [gRFC A58: weighted_round_robin LB policy][A58] + +* [gRFC A58][A58] +* [gRFC A66][A66] +* [gRFC A78][A78] +* [gRFC A79][A79] +* [gRFC A89][A89] ## Proposal -Add slow start configuration to the `weighted_round_robin` load balancing policy. The slow start feature will scale the computed weights for endpoints during their warmup period, gradually increasing the traffic they receive. +Add slow start configuration to the `weighted_round_robin` load balancing policy. The slow start feature will scale the +computed weights for endpoints during their warmup period, gradually increasing the traffic they receive. ### LB Policy Config and Parameters @@ -49,100 +75,119 @@ message ClientSideWeightedRoundRobin { message SlowStartConfig { // Represents the size of slow start window. - // If set, the newly created host remains in slow start mode starting from its creation time + // If set, the newly created endpoint remains in slow start mode starting from its creation time // for the duration of slow start window. google.protobuf.Duration slow_start_window = 1; // This parameter controls the speed of traffic increase over the slow start window. Defaults to 1.0, // so that endpoint would get linearly increasing amount of traffic. // When increasing the value for this parameter, the speed of traffic ramp-up increases non-linearly. - // The value of aggression parameter should be greater than 0.0. + // The value of aggression parameter must be greater than 0.0. // By tuning the parameter, it is possible to achieve polynomial or exponential shape of ramp-up curve. // // During slow start window, effective weight of an endpoint would be scaled with time factor and aggression: // ``new_weight = weight * max(min_weight_percent / 100, time_factor ^ (1 / aggression))``, - // where ``time_factor=(time_since_start_seconds / slow_start_time_seconds)``. + // where ``time_factor=max(time_since_start_seconds, 1) / slow_start_window_seconds``. // // As time progresses, more and more traffic would be sent to endpoint, which is in slow start window. - // Once host exits slow start, time_factor and aggression no longer affect its weight. + // Once endpoint exits slow start, time_factor and aggression no longer affect its weight. google.protobuf.FloatValue aggression = 2; // Configures the minimum percentage of the original weight that will be used for an endpoint // in slow start. This helps to avoid a scenario in which endpoints receive no traffic during the - // slow start window. Must be between 0 and 100. If not specified, the default is 10%. + // slow start window. Valid range is between 0 and 100. If the value is not specified, the default is 10%. google.protobuf.UInt32Value min_weight_percent = 3; } ``` -### Weight Scaling During Warmup - -When an endpoint is ready after being in a non-ready state, it enters the warmup period. During this period, its weight will be scaled by a factor that increases non-linearly from `min_weight_percent` to 100% over the duration of `slow_start_window`. +### Subchannel Weights and Scaling During Warmup -The scale factor is calculated as follows: +To maintain independence between the blackout period and slow start period, a new timestamp `ready_since` will be +introduced to track when an endpoint transitioned to ready state. This timestamp is separate from the existing +`non_empty_since` timestamp used for the blackout period. -``` -time_factor = max(time_since_ready_in_seconds, 1) / slow_start_window_seconds -scale = max(min_weight_percent/100, time_factor ^ (1/aggression)) -``` +The `ready_since` timestamp is set when an endpoint transitions from a non-ready state (e.g., CONNECTING, +TRANSIENT_FAILURE) to a ready state (READY). This marks the beginning of the slow start period for that endpoint. The +existing `non_empty_since` timestamp continues to be used exclusively for tracking the blackout period, which begins +when the first non-zero load report is received. -The following image shows how different aggression values affect the scaling factor over time during the slow start window (in milliseconds): - -![Effect of aggression parameter on slow start scaling](A123_graphics/aggression_scaling.png) - -The graph illustrates how the scaling factor (effective weight) ramps up from zero to the backend weight for various aggression values, with time shown in milliseconds. - -The final weight used for load balancing will be: -``` -final_weight = computed_weight * scale -``` +Weight calculation in the WRR policy follows a two-step process. First, the base weight for each endpoint is computed +using the formula from [gRFC A58][A58]: -### Subchannel Weights - -To maintain independence between the blackout period and slow start period, a new timestamp `ready_since` will be introduced to track when an endpoint transitioned to ready state. This timestamp is separate from the existing `non_empty_since` timestamp used for the blackout period. - -The `ready_since` timestamp is set when an endpoint transitions from a non-ready state (e.g., CONNECTING, TRANSIENT_FAILURE) to a ready state (READY). This marks the beginning of the slow start period for that endpoint. The existing `non_empty_since` timestamp continues to be used exclusively for tracking the blackout period, which begins when the first non-zero load report is received. +$$weight = \dfrac{qps}{utilization + \dfrac{eps}{qps} * error\\_utilization\\_penalty}$$ -Weight calculation in the WRR policy follows a two-step process. First, the base weight for each endpoint is computed using the formula from [gRFC A58][A58]: +This base weight represents the endpoint's capacity based on its current performance metrics. When an endpoint enters the +warmup period after being in a non-ready state, its weight will be scaled by a factor that increases non-linearly from +`min_weight_percent` to 100% over the duration of `slow_start_window`. -$$weight = \dfrac{qps}{utilization + \dfrac{eps}{qps} * error\\_utilization\\_penalty}$$ +The scale factor is calculated as follows: -This base weight represents the endpoint's capacity based on its current performance metrics. During the warmup period, this weight is then scaled using the slow start formula: +$$time\\_factor = \dfrac{max(time\\_since\\_ready\\_seconds, 1)}{slow\\_start\\_window\\_seconds}$$ -$$scaled\\_weight = weight * max(min\\_weight\\_percent, time\\_factor ^ {1/aggression})$$ +$$scaled\\_weight = weight * max(min\\_weight\\_percent/100, time\\_factor ^ {1/aggression})$$ -where, +The following image shows how different aggression values affect the scaling factor over time during the slow start +window (in milliseconds): -$$time\\_factor = \dfrac{max(time\\_since\\_ready\\_seconds, 1)}{slow\\_start\\_window\\_seconds}$$ +![Effect of aggression parameter on slow start scaling](A100_graphics/aggression_scaling.png) -The scaling formula ensures that new endpoints receive a gradually increasing share of traffic while maintaining a minimum threshold to prevent starvation. The `aggression` parameter allows fine-tuning of the ramp-up curve, enabling either more aggressive initial scaling (values > 1.0) or more conservative approaches (values < 1.0). +The scaling formula ensures that new endpoints receive a gradually increasing share of traffic while maintaining a +minimum threshold to prevent starvation. The `aggression` parameter allows fine-tuning of the ramp-up curve, enabling +either more aggressive initial scaling (values > 1.0) or more conservative approaches (values < 1.0). -When an endpoint is not in the warmup period, the scale factor is set to 1.0, meaning the original weight is used without modification. This ensures that the slow start mechanism only affects endpoints during their initial warmup phase, after which they participate in normal load balancing based on their actual performance metrics. +When an endpoint is not in the warmup period, the scale factor is set to 1.0, meaning the original weight is used +without modification. This ensures that the slow start mechanism only affects endpoints during their initial warmup +phase, after which they participate in normal load balancing based on their actual performance metrics. ### Blackout Period vs Slow Start -The WRR load balancing policy will offer two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. +The WRR load balancing policy will offer two independent mechanisms for handling new endpoints: the blackout period and +slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that +best fits their needs. -The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report (tracked by `non_empty_since` timestamp). During this period, the endpoint continues to receive traffic, but instead of using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the weights used are based on stable, continuous load reporting. +The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report ( +tracked by `non_empty_since` timestamp). During this period, the endpoint continues to receive traffic, but instead of +using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This +period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the +weights used are based on stable, continuous load reporting. -The slow start period begins when an endpoint transitions to ready state (tracked by `ready_since` timestamp) and applies a gradual scaling factor to the weights over a configurable duration. This scaling is applied to whatever weight is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout period). The slow start period operates independently of the blackout period, meaning it will continue to scale the weights regardless of whether the blackout period is still active or has ended. +The slow start period begins when an endpoint transitions to ready state (tracked by `ready_since` timestamp) and +applies a gradual scaling factor to the weights over a configurable duration. This scaling is applied to whatever weight +is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout +period). The slow start period operates independently of the blackout period, meaning it will continue to scale the +weights regardless of whether the blackout period is still active or has ended. The independence of these mechanisms allows for more flexible configurations: + - Slow start can begin immediately when an endpoint becomes ready, even before any load reports are received -- The blackout period can continue to function as designed for weight stability, regardless of the slow start configuration +- The blackout period can continue to function as designed for weight stability, regardless of the slow start + configuration - Both mechanisms can be tuned independently based on specific operational requirements -It is recommended to keep the blackout period shorter than the slow start period. This is because when the blackout period ends, the endpoint's weight will suddenly change from the mean weight to its actual backend-reported weight. If this weight is significantly higher than the mean (e.g., 2x the mean weight), it could cause a sudden traffic spike that defeats the purpose of gradual traffic increase. By having a longer slow start period, the scaling factor will continue to gradually increase the weight even after the blackout period ends, ensuring a smooth transition to the full backend-reported weight. +It is recommended to keep the blackout period shorter than the slow start period. This is because when the blackout +period ends, the endpoint's weight will suddenly change from the mean weight to its actual backend-reported weight. If +this weight is significantly higher than the mean (e.g., 2x the mean weight), it could cause a sudden traffic spike that +defeats the purpose of gradual traffic increase. By having a longer slow start period, the scaling factor will continue +to gradually increase the weight even after the blackout period ends, ensuring a smooth transition to the full +backend-reported weight. -When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is typically not triggered. When new weights arrive after expiration, the endpoint will enter the blackout period again but not the slow start since there was no transition of sub-channel state and no gradual traffic increase should be expected. +When endpoint weights become stale after the `weight_expiration_period`, the load balancer will continue to use the mean +weight for load balancing. This is different from the blackout period as it's a response to weight staleness rather than +initial endpoint setup. In these cases, since the endpoint weights were previously active, the slow start period is +typically not triggered. When new weights arrive after expiration, the endpoint will enter the blackout period again but +not the slow start since there was no transition of sub-channel state and no gradual traffic increase should be +expected. These mechanisms can be configured in different ways: + - Using only blackout period: Ensures stable weight reporting by using mean weights before switching to backend weights - Using only slow start: Allows immediate use of backend weights but scales them gradually - Using both: Provides both stable weight reporting and gradual scaling - - The slow start period will scale the mean weights during blackout period - - After blackout period ends, it will continue to scale the actual backend-reported weights + - The slow start period will scale the mean weights during blackout period + - After blackout period ends, it will continue to scale the actual backend-reported weights -This flexible design allows operators to tune the behavior based on their specific needs, whether they want to prioritize stable weight reporting, faster weight adoption, or gradual traffic ramp-up. +This flexible design allows operators to tune the behavior based on their specific needs, whether they want to +prioritize stable weight reporting, faster weight adoption, or gradual traffic ramp-up. ### Example Implementation @@ -194,55 +239,70 @@ message SlowStartConfig { } ``` +xDS PR: https://github.com/envoyproxy/envoy/pull/40090 + +### Metrics + +The following metric will be exposed to help monitor the slow start behavior: + +`grpc.lb.wrr.endpoints_in_slow_start` + +- Type: Counter +- Description: Number of endpoints currently in slow start period +- Labels: + - `grpc.lb.locality`: The locality of the endpoints [gRFC A78][A78] + - `grpc.lb.backend_service`: The backend service name [gRFC A89][A89] + - `grpc.target`: gRPC channel target [gRFC A66][A66] + +This metric will help operators monitor the number of endpoints currently in slow start mode across different localities +and backend services. + ## Rationale -The slow start feature helps prevent overwhelming new endpoints by gradually increasing their traffic load. This is particularly important in systems where endpoints need time to: +The slow start feature helps prevent overwhelming new endpoints by gradually increasing their traffic load. This is +particularly important in systems where endpoints need time to: + - Warm up their caches - Establish connections to downstream services - Initialize internal state - Build up connection pools -By scaling the weights during the warmup period, we allow new endpoints to handle a smaller portion of traffic initially, reducing the risk of errors and high latency during the critical warmup phase. +By scaling the weights during the warmup period, we allow new endpoints to handle a smaller portion of traffic +initially, reducing the risk of errors and high latency during the critical warmup phase. ### Effectiveness Considerations The slow start feature is most effective in scenarios where: + - Few new endpoints are added at a time (e.g., scale events in Kubernetes) - Endpoints need time to warm up caches or establish connections - The system has sufficient traffic to gradually increase load The feature may be less effective when: + - All endpoints are relatively new (e.g., new deployment in Kubernetes) - The system has low traffic volume - There are many endpoints in the cluster In these cases, the slow start feature may lead to: + - Endpoint starvation (low probability of receiving requests) - Non-gradual traffic increases when requests do arrive - Reduced effectiveness of the load balancing algorithm -## Scope and Limitations +### Scope and Limitations -This proposal specifically focuses on implementing slow start for the weighted round robin load balancing policy. While similar slow start functionality could potentially be implemented for other load balancing algorithms like Round Robin and Least Request, these are not included in this proposal for the following reasons: +This proposal specifically focuses on implementing slow start for the weighted round robin load balancing policy. While +similar slow start functionality could potentially be implemented for other load balancing algorithms like Round Robin +and Least Request, these are not included in this proposal for the following reasons: -1. These algorithms don't use weights to determine endpoint selection, making the implementation of slow start more complex +1. These algorithms don't use weights to determine endpoint selection, making the implementation of slow start more + complex 2. Additional considerations would be needed for how to gradually increase traffic to new endpoints in these algorithms 3. The implementation details would likely differ significantly from the weighted round robin approach -These other load balancing algorithms can be considered for slow start implementation in future proposals, with their own specific design considerations and requirements. - -## Metrics - -The following metric will be exposed to help monitor the slow start behavior: - -`grpc.lb.wrr.endpoints_in_slow_start` -- Type: Gauge -- Description: Number of endpoints currently in slow start period -- Labels: - - `grpc.lb.locality`: The locality of the endpoints - - `grpc.lb.backend_service`: The backend service name - -This metric will help operators monitor the number of endpoints currently in slow start mode across different localities and backend services. +These other load balancing algorithms can be considered for slow start implementation in future proposals, with their +own specific design considerations and requirements. ## Implementation @@ -252,3 +312,7 @@ Java Implementation: https://github.com/grpc/grpc-java/pull/12200 [Envoy Slow Start Documentation]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start [A58]: A58-client-side-weighted-round-robin-lb-policy.md +[A66]: A66-otel-stats.md +[A78]: A78-grpc-metrics-wrr-pf-xds.md +[A79]: A79-non-per-call-metrics-architecture.md +[A89]: A89-backend-service-metric-label.md diff --git a/A58-client-side-weighted-round-robin-lb-policy.md b/A58-client-side-weighted-round-robin-lb-policy.md index 64a2b7e80..f09d85cf4 100644 --- a/A58-client-side-weighted-round-robin-lb-policy.md +++ b/A58-client-side-weighted-round-robin-lb-policy.md @@ -6,6 +6,7 @@ A58: `weighted_round_robin` LB policy * Implemented in: C-core, Java, Go * Last updated: 2023-04-17 * Discussion at: https://groups.google.com/g/grpc-io/c/p18GXTlDapM +* Updated by: [A100-client-side-weighted-round-robin-slow-start.md](A100-client-side-weighted-round-robin-slow-start.md) ## Abstract From 082fc33062c9a07399314275c286db78c7da1ae1 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Sun, 20 Jul 2025 16:12:14 +0530 Subject: [PATCH 15/18] Updates proposal with experimental metric details and formatting fixes Signed-off-by: anurag.ag --- ...ient-side-weighted-round-robin-slow-start.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index b90d06406..d0657720a 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -116,7 +116,8 @@ using the formula from [gRFC A58][A58]: $$weight = \dfrac{qps}{utilization + \dfrac{eps}{qps} * error\\_utilization\\_penalty}$$ -This base weight represents the endpoint's capacity based on its current performance metrics. When an endpoint enters the +This base weight represents the endpoint's capacity based on its current performance metrics. When an endpoint enters +the warmup period after being in a non-ready state, its weight will be scaled by a factor that increases non-linearly from `min_weight_percent` to 100% over the duration of `slow_start_window`. @@ -250,13 +251,16 @@ The following metric will be exposed to help monitor the slow start behavior: - Type: Counter - Description: Number of endpoints currently in slow start period - Labels: - - `grpc.lb.locality`: The locality of the endpoints [gRFC A78][A78] - - `grpc.lb.backend_service`: The backend service name [gRFC A89][A89] - - `grpc.target`: gRPC channel target [gRFC A66][A66] + - `grpc.lb.locality`: The locality of the endpoints [gRFC A78][A78] + - `grpc.lb.backend_service`: The backend service name [gRFC A89][A89] + - `grpc.target`: gRPC channel target [gRFC A66][A66] This metric will help operators monitor the number of endpoints currently in slow start mode across different localities and backend services. +Please note that this metric will start as experimental and off by default, and we will consider stabilizing it in the +future. + ## Rationale The slow start feature helps prevent overwhelming new endpoints by gradually increasing their traffic load. This is @@ -311,8 +315,13 @@ The functionality is being implemented in Java. It will be implemented in Go, C+ Java Implementation: https://github.com/grpc/grpc-java/pull/12200 [Envoy Slow Start Documentation]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/slow_start + [A58]: A58-client-side-weighted-round-robin-lb-policy.md + [A66]: A66-otel-stats.md + [A78]: A78-grpc-metrics-wrr-pf-xds.md + [A79]: A79-non-per-call-metrics-architecture.md + [A89]: A89-backend-service-metric-label.md From c346e9ab012a95a0cec86767abc9f375788410a7 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Fri, 29 Aug 2025 07:08:18 +0530 Subject: [PATCH 16/18] Fixes formatting inconsistencies and updates terminology in A100 proposal. Adds links, clarifies slow start implementation details, and aligns with linked A24 proposal. Signed-off-by: anurag.ag --- ...nt-side-weighted-round-robin-slow-start.md | 104 ++++++++++-------- A24-lb-policy-config.md | 1 + 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index d0657720a..436780dec 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -1,4 +1,4 @@ -A100: Client-side weighted round robin slow start configuration +A100: Client-side weighted round-robin slow start configuration ---- * Author(s): [Anurag Agarwal](https://github.com/anuragagarwal561994) @@ -10,16 +10,16 @@ A100: Client-side weighted round robin slow start configuration ## Abstract This proposal introduces an enhancement to the existing client-side weighted_round_robin (WRR) load balancing policy in -gRPC by incorporating a configurable `slow_start_config` mechanism. The intent of this feature is to gradually increase -traffic to backend endpoints that are newly introduced or have recently rejoined the cluster, allowing them time to warm -up and reach their optimal performance level before handling their full share of traffic. This change increases system -stability and resilience in environments with dynamic scaling and volatile workloads. +gRPC by incorporating a configurable `slow_start_config` mechanism. This feature enables a controlled, gradual increase +in traffic allocation to backend endpoints that are either newly introduced or recently rejoined the cluster. By +gradually ramping up their traffic, this enhancement ensures backend endpoints have enough time to warm up, optimize +performance, and stabilize before serving their full traffic share. -The design borrows from production-ready practices in other data plances such as Envoy, where gradual traffic ramp-up ( -slow start) is a [well-established technique][Envoy Slow Start Documentation] for avoiding performance degradation and +The design borrows from production-ready practices in other data planes such as Envoy, where gradual traffic ramp-up +(slow start) is a [well-established technique][Envoy Slow Start Documentation] for avoiding performance degradation and request failures during backend startup or recovery. The slow start feature gradually increases the traffic sent to newly added endpoints during a warmup period, allowing them to warm up their caches and establish connections before -receiving full traffic load. +receiving the full traffic load. ## Background @@ -27,23 +27,23 @@ gRPC's WRR load balancing policy allows clients to route requests to backend end weights. These weights are usually derived from backend metrics, such as CPU usage, QPS, and error rates published by the backend servers. This allows gRPC clients to adapt traffic distribution dynamically based on backend capacity. -The current WRR implementation has a blackout period mechanism that provides some warm-up functionality, but it's not -sufficient for all cases, as described in detail below. When a new endpoint appears—either due to autoscaling, -replacement, or recovery from a failure—the client still routes traffic to it based on weights that may not account for -its initialization state. This can result in overloading the endpoint before it is fully initialized, negatively -impacting response times and service reliability. It is especially problematic for systems with cold caches, JIT -compilation warm-up delays, or dependency initialization steps. +The current WRR implementation includes a blackout period with some warm-up functionality, but it falls short in various +scenarios. When a new endpoint is introduced due to autoscaling, replacement, or recovery—clients still route traffic +based on weights that don’t account for the endpoint’s initialization state. This can overwhelm the endpoint before it +is fully stable, leading to degraded response times and reduced service reliability. It is especially problematic for +systems with cold caches, JIT compilation warm-up delays, or dependency initialization steps. In contrast, many modern systems adopt slow start strategies in load balancing to address these issues. These strategies allow endpoints to ramp up traffic gradually over a defined window, smoothing transitions and mitigating the risks of -traffic spikes. Similar functionality exists in Envoy's load balancing policies, where slow start is implemented for -round robin and least request policies. +traffic spikes. Similar functionality exists in Envoy's load balancing policies, where a slow start is implemented for +round-robin and the least request policies. Introducing a `slow_start_config` configuration in gRPC WRR will offer these benefits within the native client policy, reducing reliance on external traffic-shaping mechanisms or manual intervention. ### Related Proposals: +* [gRFC A24][A24] * [gRFC A58][A58] * [gRFC A66][A66] * [gRFC A78][A78] @@ -57,27 +57,28 @@ computed weights for endpoints during their warmup period, gradually increasing ### LB Policy Config and Parameters -The `weighted_round_robin` LB policy config will be extended to include slow start configuration: +The `weighted_round_robin` [LB policy config][A24] will be extended to include slow start configuration: ```textproto message LoadBalancingConfig { oneof policy { - ClientSideWeightedRoundRobin weighted_round_robin = 20 [json_name = "weighted_round_robin"]; + WeightedRoundRobinLbConfig weighted_round_robin = 20 [json_name = "weighted_round_robin"]; } } -message ClientSideWeightedRoundRobin { +message WeightedRoundRobinLbConfig { // ... existing fields ... // Configuration for slow start feature - SlowStartConfig slow_start_config = 8; + SlowStartConfig slow_start_config = 7; } message SlowStartConfig { // Represents the size of slow start window. - // If set, the newly created endpoint remains in slow start mode starting from its creation time + // + // The newly created endpoint remains in slow start mode starting from its creation time // for the duration of slow start window. - google.protobuf.Duration slow_start_window = 1; + google.protobuf.Duration slow_start_window = 1; // Required // This parameter controls the speed of traffic increase over the slow start window. Defaults to 1.0, // so that endpoint would get linearly increasing amount of traffic. @@ -87,16 +88,16 @@ message SlowStartConfig { // // During slow start window, effective weight of an endpoint would be scaled with time factor and aggression: // ``new_weight = weight * max(min_weight_percent / 100, time_factor ^ (1 / aggression))``, - // where ``time_factor=max(time_since_start_seconds, 1) / slow_start_window_seconds``. + // where ``time_factor = max(time_since_start_seconds, 1) / slow_start_window_seconds``. // // As time progresses, more and more traffic would be sent to endpoint, which is in slow start window. // Once endpoint exits slow start, time_factor and aggression no longer affect its weight. - google.protobuf.FloatValue aggression = 2; + float aggression = 2; // Configures the minimum percentage of the original weight that will be used for an endpoint // in slow start. This helps to avoid a scenario in which endpoints receive no traffic during the - // slow start window. Valid range is between 0 and 100. If the value is not specified, the default is 10%. - google.protobuf.UInt32Value min_weight_percent = 3; + // slow start window. Valid range is [0.0, 100.0]. If the value is not specified, the default is 10%. + float min_weight_percent = 3; } ``` @@ -140,21 +141,22 @@ When an endpoint is not in the warmup period, the scale factor is set to 1.0, me without modification. This ensures that the slow start mechanism only affects endpoints during their initial warmup phase, after which they participate in normal load balancing based on their actual performance metrics. -### Blackout Period vs Slow Start +### Blackout Period vs. Slow Start The WRR load balancing policy will offer two independent mechanisms for handling new endpoints: the blackout period and slow start. These mechanisms can be used independently or in combination, allowing operators to choose the approach that best fits their needs. -The blackout period, which defaults to 10 seconds, begins when an endpoint receives its first non-zero load report ( -tracked by `non_empty_since` timestamp). During this period, the endpoint continues to receive traffic, but instead of -using the weights reported by the backend servers, the load balancer uses the mean of all backend-reported weights. This -period helps prevent churn in the load balancing decisions when the set of endpoint addresses changes, ensuring that the -weights used are based on stable, continuous load reporting. +The blackout period begins when an endpoint’s first non‑zero load report is observed (tracked by `non_empty_since`) and +defaults to 10 seconds. Traffic is still routed to the endpoint during this time, but the load balancer ignores +per‑endpoint reported weights and uses the average of all backend‑reported weights instead. This reduces churn in +load‑balancing decisions as the set of endpoints changes and allows time for weight reports to become stable before they +are used. The slow start period begins when an endpoint transitions to ready state (tracked by `ready_since` timestamp) and applies a gradual scaling factor to the weights over a configurable duration. This scaling is applied to whatever weight -is being used (either the mean weight during blackout period or the actual backend-reported weight after blackout +is being used (either the mean weight during the blackout period or the actual backend-reported weight after the +blackout period). The slow start period operates independently of the blackout period, meaning it will continue to scale the weights regardless of whether the blackout period is still active or has ended. @@ -181,11 +183,12 @@ expected. These mechanisms can be configured in different ways: -- Using only blackout period: Ensures stable weight reporting by using mean weights before switching to backend weights +- Using only the blackout period: Ensures stable weight reporting by using mean weights before switching to backend + weights - Using only slow start: Allows immediate use of backend weights but scales them gradually - Using both: Provides both stable weight reporting and gradual scaling - - The slow start period will scale the mean weights during blackout period - - After blackout period ends, it will continue to scale the actual backend-reported weights + - The slow start period will scale the mean weights during the blackout period + - After the blackout period ends, it will continue to scale the actual backend-reported weights This flexible design allows operators to tune the behavior based on their specific needs, whether they want to prioritize stable weight reporting, faster weight adoption, or gradual traffic ramp-up. @@ -223,14 +226,14 @@ function get_final_weight(endpoint_weight: float, scaling_factor: float) -> floa ### xDS Integration -The slow start configuration will be added to the xDS proto for the weighted round robin policy: +The slow start configuration will be added to the xDS proto for the weighted round-robin policy: ```textproto package envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3; message ClientSideWeightedRoundRobin { // ... existing fields ... - cluster.v3.Cluster.SlowStartConfig slow_start_config = 8; + common.v3.SlowStartConfig slow_start_config = 8; } message SlowStartConfig { @@ -242,6 +245,16 @@ message SlowStartConfig { xDS PR: https://github.com/envoyproxy/envoy/pull/40090 +#### Transforming xDS message to gRPC service config + +The gRPC client converts the xDS policy config into the gRPC service config format defined +in [LB Policy Config](#lb-policy-config-and-parameters). For the slow start fields, the transformation is as follows: + +* `ClientSideWeightedRoundRobin.slow_start_config` -> `LoadBalancingConfig.weighted_round_robin.slow_start_config` +* `SlowStartConfig.slow_start_window` -> `SlowStartConfig.slow_start_window` +* `SlowStartConfig.aggression` -> `SlowStartConfig.aggression` +* `SlowStartConfig.min_weight_percent.value` -> `SlowStartConfig.min_weight_percent` + ### Metrics The following metric will be exposed to help monitor the slow start behavior: @@ -249,7 +262,8 @@ The following metric will be exposed to help monitor the slow start behavior: `grpc.lb.wrr.endpoints_in_slow_start` - Type: Counter -- Description: Number of endpoints currently in slow start period +- Description: Number of endpoints currently in the slow start period. This is incremented when a new scheduler is + created. - Labels: - `grpc.lb.locality`: The locality of the endpoints [gRFC A78][A78] - `grpc.lb.backend_service`: The backend service name [gRFC A89][A89] @@ -280,7 +294,7 @@ The slow start feature is most effective in scenarios where: - Few new endpoints are added at a time (e.g., scale events in Kubernetes) - Endpoints need time to warm up caches or establish connections -- The system has sufficient traffic to gradually increase load +- The system has enough traffic to gradually increase the load The feature may be less effective when: @@ -296,14 +310,14 @@ In these cases, the slow start feature may lead to: ### Scope and Limitations -This proposal specifically focuses on implementing slow start for the weighted round robin load balancing policy. While -similar slow start functionality could potentially be implemented for other load balancing algorithms like Round Robin -and Least Request, these are not included in this proposal for the following reasons: +This proposal only adds a slow start to weighted round-robin. While similar slow start functionality could potentially +be implemented for other load balancing algorithms like Round Robin and Least Request, these are not included in this +proposal for the following reasons: 1. These algorithms don't use weights to determine endpoint selection, making the implementation of slow start more complex 2. Additional considerations would be needed for how to gradually increase traffic to new endpoints in these algorithms -3. The implementation details would likely differ significantly from the weighted round robin approach +3. The implementation details would likely differ significantly from the weighted round-robin approach These other load balancing algorithms can be considered for slow start implementation in future proposals, with their own specific design considerations and requirements. @@ -325,3 +339,5 @@ Java Implementation: https://github.com/grpc/grpc-java/pull/12200 [A79]: A79-non-per-call-metrics-architecture.md [A89]: A89-backend-service-metric-label.md + +[A24]: A24-lb-policy-config.md \ No newline at end of file diff --git a/A24-lb-policy-config.md b/A24-lb-policy-config.md index 0ba034d0a..8d40c21ea 100644 --- a/A24-lb-policy-config.md +++ b/A24-lb-policy-config.md @@ -6,6 +6,7 @@ Load Balancing Policy Configuration * Implemented in: C-core * Last updated: 2018-12-05 * Discussion at: https://groups.google.com/d/topic/grpc-io/K03NV5H8HoE/discussion +* Updated By: [A100-client-side-weighted-round-robin-slow-start.md](A100-client-side-weighted-round-robin-slow-start.md) ## Abstract From 82a40891c0475a6753c8c7a980c73b82d1bfed28 Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Fri, 29 Aug 2025 21:24:11 +0530 Subject: [PATCH 17/18] Aligns A100 proposal with related gRFCs, updates references, fixes formatting, and changes `aggression` type to `double`. Signed-off-by: anurag.ag --- ...nt-side-weighted-round-robin-slow-start.md | 20 +++++++++---------- A24-lb-policy-config.md | 1 - A78-grpc-metrics-wrr-pf-xds.md | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index 436780dec..ba091e94d 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -43,12 +43,12 @@ reducing reliance on external traffic-shaping mechanisms or manual intervention. ### Related Proposals: -* [gRFC A24][A24] -* [gRFC A58][A58] -* [gRFC A66][A66] -* [gRFC A78][A78] -* [gRFC A79][A79] -* [gRFC A89][A89] +* [A24: Load Balancing Policy Configuration][A24] +* [A58: `weighted_round_robin` LB policy][A58] +* [A66: OpenTelemetry Metrics][A66] +* [A78: gRPC OTel Metrics for WRR, Pick First, and XdsClient][A78] +* [A79: Non-per-call Metrics Architecture][A79] +* [A89: Backend Service Metric Label][A89] ## Proposal @@ -92,7 +92,7 @@ message SlowStartConfig { // // As time progresses, more and more traffic would be sent to endpoint, which is in slow start window. // Once endpoint exits slow start, time_factor and aggression no longer affect its weight. - float aggression = 2; + double aggression = 2; // Configures the minimum percentage of the original weight that will be used for an endpoint // in slow start. This helps to avoid a scenario in which endpoints receive no traffic during the @@ -199,7 +199,7 @@ prioritize stable weight reporting, faster weight adoption, or gradual traffic r // Configuration parameters slow_start_window: Duration min_weight_percent: float -aggression: float +aggression: double // State non_empty_since: Time // Time when first non-zero load report was received (for blackout period) @@ -209,10 +209,10 @@ function get_scale() -> float: time_elapsed_since_ready = current_time - ready_since if time_elapsed_since_ready >= slow_start_window: return 1.0 - + time_factor = max(time_elapsed_since_ready, 1.0) / slow_start_window min_scale = min_weight_percent / 100.0 - + // Apply non-linear scaling based on aggression factor scale = max(min_scale, time_factor ^ (1.0 / aggression)) return scale diff --git a/A24-lb-policy-config.md b/A24-lb-policy-config.md index 8d40c21ea..0ba034d0a 100644 --- a/A24-lb-policy-config.md +++ b/A24-lb-policy-config.md @@ -6,7 +6,6 @@ Load Balancing Policy Configuration * Implemented in: C-core * Last updated: 2018-12-05 * Discussion at: https://groups.google.com/d/topic/grpc-io/K03NV5H8HoE/discussion -* Updated By: [A100-client-side-weighted-round-robin-slow-start.md](A100-client-side-weighted-round-robin-slow-start.md) ## Abstract diff --git a/A78-grpc-metrics-wrr-pf-xds.md b/A78-grpc-metrics-wrr-pf-xds.md index 7fb5777a5..54ebe2728 100644 --- a/A78-grpc-metrics-wrr-pf-xds.md +++ b/A78-grpc-metrics-wrr-pf-xds.md @@ -6,7 +6,7 @@ A78: gRPC OTel Metrics for WRR, Pick First, and XdsClient * Implemented in: * Last updated: 2025-07-01 * Discussion at: https://groups.google.com/g/grpc-io/c/A2Mqz8OMDys -* Updated by: [A88: xDS Data Error Handling](A88-xds-data-error-handling.md), [A94: OTel metrics for Subchannels](A94-subchannel-otel-metrics.md) +* Updated by: [A88: xDS Data Error Handling](A88-xds-data-error-handling.md), [A94: OTel metrics for Subchannels](A94-subchannel-otel-metrics.md), [A100: Client-side weighted round-robin slow start configuration](A100-client-side-weighted-round-robin-slow-start.md) ## Abstract From c17b3f6cd3cd2040d7d3ed26f24b87f3f400eb0f Mon Sep 17 00:00:00 2001 From: "anurag.ag" Date: Fri, 29 Aug 2025 22:04:35 +0530 Subject: [PATCH 18/18] Updates A100 proposal with `min_weight_percent` type change and minor formatting fixes. Signed-off-by: anurag.ag --- A100-client-side-weighted-round-robin-slow-start.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/A100-client-side-weighted-round-robin-slow-start.md b/A100-client-side-weighted-round-robin-slow-start.md index ba091e94d..77c35e3b4 100644 --- a/A100-client-side-weighted-round-robin-slow-start.md +++ b/A100-client-side-weighted-round-robin-slow-start.md @@ -97,7 +97,7 @@ message SlowStartConfig { // Configures the minimum percentage of the original weight that will be used for an endpoint // in slow start. This helps to avoid a scenario in which endpoints receive no traffic during the // slow start window. Valid range is [0.0, 100.0]. If the value is not specified, the default is 10%. - float min_weight_percent = 3; + google.protobuf.FloatValue min_weight_percent = 3; } ``` @@ -118,9 +118,8 @@ using the formula from [gRFC A58][A58]: $$weight = \dfrac{qps}{utilization + \dfrac{eps}{qps} * error\\_utilization\\_penalty}$$ This base weight represents the endpoint's capacity based on its current performance metrics. When an endpoint enters -the -warmup period after being in a non-ready state, its weight will be scaled by a factor that increases non-linearly from -`min_weight_percent` to 100% over the duration of `slow_start_window`. +the warmup period after being in a non-ready state, its weight will be scaled by a factor that increases non-linearly +from `min_weight_percent` to 100% over the duration of `slow_start_window`. The scale factor is calculated as follows: