From 3f15206f090ce36c08282b8d64d6ff9c15c8fd69 Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Thu, 6 Jan 2022 11:49:57 +0000 Subject: Support dynamic throttling of async persistence operations Adds an operation throttler that is intended to provide global throttling of async operations across all persistence stripe threads. A throttler wraps a logical max pending window size of in-flight operations. Depending on the throttler implementation, the window size may expand and shrink dynamically. Exactly how and when this happens is unspecified. Commit adds two throttler implementations: * An unlimited throttler that is no-op and never blocks. * A throttler built around the mbus `DynamicThrottlePolicy` and defers all window decisions to it. Current config default is to use the unlimited throttler. Config changes require a process restart. Offers both polling and (timed, non-timed) blocking calls for acquiring a throttle token. If the returned token is valid, the caller may proceed to invoke the asynchronous operation. The window slot taken up by a valid throttle token is implicitly freed up when the token is destroyed. --- configdefinitions/src/vespa/stor-filestor.def | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'configdefinitions/src') diff --git a/configdefinitions/src/vespa/stor-filestor.def b/configdefinitions/src/vespa/stor-filestor.def index 66700eff3e6..c351e52b557 100644 --- a/configdefinitions/src/vespa/stor-filestor.def +++ b/configdefinitions/src/vespa/stor-filestor.def @@ -75,3 +75,22 @@ use_async_message_handling_on_schedule bool default=false restart ## the entire resource usage sample is immediately reported to the cluster controller (via host info). ## This config can be live updated (doesn't require restart). resource_usage_reporter_noise_level double default=0.001 + +## Specify throttling used for async persistence operations. This throttling takes place +## before operations are dispatched to Proton and serves as a limiter for how many +## operations may be in flight in Proton's internal queues. +## +## - UNLIMITED is, as it says on the tin, unlimited. Offers no actual throttling, but +## has near zero overhead and never blocks. +## - DYNAMIC uses DynamicThrottlePolicy under the hood and will block if the window +## is full (if a blocking throttler API call is invoked). +## +async_operation_throttler_type enum { UNLIMITED, DYNAMIC } default=UNLIMITED restart + +## Specifies the extent the throttling window is increased by when the async throttle +## policy has decided that more concurrent operations are desirable. Also affects the +## _minimum_ size of the throttling window; its size is implicitly set to max(this config +## value, number of threads). +## +## Only applies if async_operation_throttler_type == DYNAMIC. +async_operation_dynamic_throttling_window_increment int default=20 restart -- cgit v1.2.3