summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2020-11-12 10:20:05 -0800
committerFlorin Coras <florin.coras@gmail.com>2020-12-01 18:50:59 +0000
commita39f472a2cf7c033deb9f7073489f83a17d5bf12 (patch)
tree506adc79c9d4f840b092c8f3299397f74f88fc80
parent7808df2e2fd0fd61a27e5a5322dc6dafe40924e5 (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.h6
-rw-r--r--src/vnet/session/transport.c13
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