diff options
author | Florin Coras <fcoras@cisco.com> | 2020-11-12 10:20:05 -0800 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-12-01 18:50:59 +0000 |
commit | a39f472a2cf7c033deb9f7073489f83a17d5bf12 (patch) | |
tree | 506adc79c9d4f840b092c8f3299397f74f88fc80 | |
parent | 7808df2e2fd0fd61a27e5a5322dc6dafe40924e5 (diff) |
session: make pacer worker load aware
Type: improvement
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I71b9d54311fcad808fcdaad0df2dca8c161d580e
-rw-r--r-- | src/vnet/session/session.h | 6 | ||||
-rw-r--r-- | src/vnet/session/transport.c | 13 |
2 files changed, 14 insertions, 5 deletions
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 9b9cd29114d..e62aea483cf 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -552,6 +552,12 @@ transport_us_time_now (u32 thread_index) return session_main.wrk[thread_index].last_vlib_us_time; } +always_inline clib_time_type_t +transport_seconds_per_loop (u32 thread_index) +{ + return session_main.wrk[thread_index].vm->seconds_per_loop; +} + always_inline void transport_add_tx_event (transport_connection_t * tc) { diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c index a7fd85f5f2e..7cc2a8e04c5 100644 --- a/src/vnet/session/transport.c +++ b/src/vnet/session/transport.c @@ -632,7 +632,7 @@ format_transport_pacer (u8 * s, va_list * args) now = transport_us_time_now (thread_index); diff = now - pacer->last_update; - s = format (s, "rate %lu bucket %lu t/p %.3f last_update %U burst %u", + s = format (s, "rate %lu bucket %ld t/p %.3f last_update %U burst %u", pacer->bytes_per_sec, pacer->bucket, pacer->tokens_per_period, format_clib_us_time, diff, pacer->max_burst); return s; @@ -661,7 +661,7 @@ spacer_update_bucket (spacer_t * pacer, u32 bytes) static inline void spacer_set_pace_rate (spacer_t * pacer, u64 rate_bytes_per_sec, - clib_us_time_t rtt) + clib_us_time_t rtt, clib_time_type_t sec_per_loop) { clib_us_time_t max_time; @@ -678,7 +678,8 @@ spacer_set_pace_rate (spacer_t * pacer, u64 rate_bytes_per_sec, * * Max "time-length" of a burst cannot be less than 1us or more than 1ms. */ - max_time = rtt / TRANSPORT_PACER_BURSTS_PER_RTT; + max_time = clib_max (rtt / TRANSPORT_PACER_BURSTS_PER_RTT, + (clib_us_time_t) (sec_per_loop * CLIB_US_TIME_FREQ)); max_time = clib_clamp (max_time, 1 /* 1us */ , 1000 /* 1ms */ ); pacer->max_burst = (rate_bytes_per_sec * max_time) * CLIB_US_TIME_PERIOD; pacer->max_burst = clib_clamp (pacer->max_burst, TRANSPORT_PACER_MIN_BURST, @@ -703,7 +704,8 @@ transport_connection_tx_pacer_reset (transport_connection_t * tc, u64 rate_bytes_per_sec, u32 start_bucket, clib_us_time_t rtt) { - spacer_set_pace_rate (&tc->pacer, rate_bytes_per_sec, rtt); + spacer_set_pace_rate (&tc->pacer, rate_bytes_per_sec, rtt, + transport_seconds_per_loop (tc->thread_index)); spacer_reset (&tc->pacer, transport_us_time_now (tc->thread_index), start_bucket); } @@ -729,7 +731,8 @@ void transport_connection_tx_pacer_update (transport_connection_t * tc, u64 bytes_per_sec, clib_us_time_t rtt) { - spacer_set_pace_rate (&tc->pacer, bytes_per_sec, rtt); + spacer_set_pace_rate (&tc->pacer, bytes_per_sec, rtt, + transport_seconds_per_loop (tc->thread_index)); } u32 |