Cap resource max window for resource transfer over very slow links

This commit is contained in:
Mark Qvist 2024-10-05 20:54:42 +02:00
parent 7363c9c821
commit 53226d7035
1 changed files with 20 additions and 0 deletions

View File

@ -54,6 +54,9 @@ class Resource:
# The maximum window size for transfers on slow links # The maximum window size for transfers on slow links
WINDOW_MAX_SLOW = 10 WINDOW_MAX_SLOW = 10
# The maximum window size for transfers on very slow links
WINDOW_MAX_VERY_SLOW = 4
# The maximum window size for transfers on fast links # The maximum window size for transfers on fast links
WINDOW_MAX_FAST = 75 WINDOW_MAX_FAST = 75
@ -65,12 +68,22 @@ class Resource:
# rounds, the fast link window size will be allowed. # rounds, the fast link window size will be allowed.
FAST_RATE_THRESHOLD = WINDOW_MAX_SLOW - WINDOW - 2 FAST_RATE_THRESHOLD = WINDOW_MAX_SLOW - WINDOW - 2
# If the very slow rate is sustained for this many request
# rounds, window will be capped to the very slow limit.
VERY_SLOW_RATE_THRESHOLD = 2
# If the RTT rate is higher than this value, # If the RTT rate is higher than this value,
# the max window size for fast links will be used. # the max window size for fast links will be used.
# The default is 50 Kbps (the value is stored in # The default is 50 Kbps (the value is stored in
# bytes per second, hence the "/ 8"). # bytes per second, hence the "/ 8").
RATE_FAST = (50*1000) / 8 RATE_FAST = (50*1000) / 8
# If the RTT rate is lower than this value,
# the window size will be capped at .
# The default is 50 Kbps (the value is stored in
# bytes per second, hence the "/ 8").
RATE_VERY_SLOW = (2*1000) / 8
# The minimum allowed flexibility of the window size. # The minimum allowed flexibility of the window size.
# The difference between window_max and window_min # The difference between window_max and window_min
# will never be smaller than this value. # will never be smaller than this value.
@ -275,6 +288,7 @@ class Resource:
self.req_resp_rtt_rate = 0 self.req_resp_rtt_rate = 0
self.rtt_rxd_bytes_at_part_req = 0 self.rtt_rxd_bytes_at_part_req = 0
self.fast_rate_rounds = 0 self.fast_rate_rounds = 0
self.very_slow_rate_rounds = 0
self.request_id = request_id self.request_id = request_id
self.is_response = is_response self.is_response = is_response
@ -759,6 +773,12 @@ class Resource:
if self.fast_rate_rounds == Resource.FAST_RATE_THRESHOLD: if self.fast_rate_rounds == Resource.FAST_RATE_THRESHOLD:
self.window_max = Resource.WINDOW_MAX_FAST self.window_max = Resource.WINDOW_MAX_FAST
if self.fast_rate_rounds == 0 and self.req_data_rtt_rate < Resource.RATE_VERY_SLOW and self.very_slow_rate_rounds < Resource.VERY_SLOW_RATE_THRESHOLD:
self.very_slow_rate_rounds += 1
if self.very_slow_rate_rounds == Resource.VERY_SLOW_RATE_THRESHOLD:
self.window_max = Resource.WINDOW_MAX_VERY_SLOW
self.request_next() self.request_next()
else: else:
self.receiving_part = False self.receiving_part = False