From 4194300ec0af4e268bdb722ba13266352408009c Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Mon, 23 Nov 2020 20:01:19 +0100 Subject: lib: Reduce timerwheel CPU consumption The timerwheel is checked during IPC calls (fevent, flow_read), causing huge load on CPU consumption in IPCPs, since they have a lot of fevent() threads for QoS. The timerwheel will need further optimization), but for now I reduced the default tick time to 5 ms and added a boolean to check that the wheel is actually used. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- src/lib/CMakeLists.txt | 2 +- src/lib/timerwheel.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index e6d175d3..76d0530d 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -200,7 +200,7 @@ set(FRCT_START_WINDOW 64 CACHE STRING "Start window, must be a power of 2") set(FRCT_RTO_MIN 250 CACHE STRING "Minimum Retransmission Timeout (RTO) for FRCT (us)") -set(FRCT_TICK_TIME 500 CACHE STRING +set(FRCT_TICK_TIME 5000 CACHE STRING "Tick time for FRCT activity (retransmission, acknowledgments) (us)") set(RXM_BUFFER_ON_HEAP FALSE CACHE BOOL "Store packets for retransmission on the heap instead of in packet buffer") diff --git a/src/lib/timerwheel.c b/src/lib/timerwheel.c index cd3074cb..a9f3c72a 100644 --- a/src/lib/timerwheel.c +++ b/src/lib/timerwheel.c @@ -65,6 +65,8 @@ struct { size_t prv_rxm; /* Last processed rxm slot at lvl 0. */ size_t prv_ack; /* Last processed ack slot. */ pthread_mutex_t lock; + + bool in_use; } rw; static void timerwheel_fini(void) @@ -140,6 +142,9 @@ static void timerwheel_move(void) size_t i; size_t j; + if (!__sync_bool_compare_and_swap(&rw.in_use, true, true)) + return; + pthread_mutex_lock(&rw.lock); pthread_cleanup_push((void (*) (void *)) pthread_mutex_unlock, @@ -373,6 +378,8 @@ static int timerwheel_rxm(struct frcti * frcti, #endif pthread_mutex_unlock(&rw.lock); + __sync_bool_compare_and_swap(&rw.in_use, false, true); + return 0; } @@ -416,5 +423,7 @@ static int timerwheel_ack(int fd, pthread_mutex_unlock(&rw.lock); + __sync_bool_compare_and_swap(&rw.in_use, false, true); + return 0; } -- cgit v1.2.3