From d9dd457137c7c9ca43bcc5334576454d5084eacf Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Wed, 27 Sep 2023 17:36:33 +0200 Subject: [PATCH 1/4] trace: add flush worker and optimize memory usage --- src/trace/trace.c | 53 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/src/trace/trace.c b/src/trace/trace.c index 472aeeea7..f34627f77 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include #ifdef HAVE_PTHREAD #include @@ -27,7 +29,17 @@ #include #endif -#define TRACE_BUFFER_SIZE 1000000 +#ifndef TRACE_BUFFER_SIZE +#define TRACE_BUFFER_SIZE 10000 +#endif + +enum { + TRACE_FLUSH_TMR = 1000, +}; + +#define DEBUG_MODULE "trace" +#define DEBUG_LEVEL 5 +#include struct trace_event { const char *name; @@ -47,15 +59,16 @@ struct trace_event { /** Trace configuration */ static struct { + RE_ATOMIC bool init; int process_id; FILE *f; int event_count; struct trace_event *event_buffer; struct trace_event *event_buffer_flush; mtx_t lock; - bool init; bool new; uint64_t start_time; + struct tmr flush_tmr; } trace = { .init = false }; @@ -90,6 +103,25 @@ static inline int get_process_id(void) } +static int flush_worker(void *arg) +{ + (void)arg; + re_trace_flush(); + + return 0; +} + + +static void flush_tmr(void *arg) +{ + (void)arg; + + re_thread_async(flush_worker, NULL, NULL); + + tmr_start(&trace.flush_tmr, TRACE_FLUSH_TMR, flush_tmr, NULL); +} + + /** * Init new trace json file * @@ -108,7 +140,7 @@ int re_trace_init(const char *json_file) if (!json_file) return EINVAL; - if (trace.init) + if (re_atomic_rlx(&trace.init)) return EALREADY; trace.event_buffer = mem_zalloc( @@ -137,12 +169,15 @@ int re_trace_init(const char *json_file) (void)fflush(trace.f); trace.start_time = tmr_jiffies_usec(); - trace.init = true; + re_atomic_rlx_set(&trace.init, true); trace.new = true; + tmr_init(&trace.flush_tmr); + tmr_start(&trace.flush_tmr, TRACE_FLUSH_TMR, flush_tmr, NULL); + out: if (err) { - trace.init = false; + re_atomic_rlx_set(&trace.init, false); mem_deref(trace.event_buffer); mem_deref(trace.event_buffer_flush); } @@ -163,13 +198,14 @@ int re_trace_close(void) #ifndef RE_TRACE_ENABLED return 0; #endif + tmr_cancel(&trace.flush_tmr); re_trace_flush(); trace.event_buffer = mem_deref(trace.event_buffer); trace.event_buffer_flush = mem_deref(trace.event_buffer_flush); mtx_destroy(&trace.lock); - trace.init = false; + re_atomic_rlx_set(&trace.init, false); (void)re_fprintf(trace.f, "\n\t]\n}\n"); if (trace.f) @@ -201,7 +237,7 @@ int re_trace_flush(void) return 0; #endif - if (!trace.init) + if (!re_atomic_rlx(&trace.init)) return 0; mtx_lock(&trace.lock); @@ -266,11 +302,12 @@ void re_trace_event(const char *cat, const char *name, char ph, void *id, return; #endif - if (!trace.init) + if (!re_atomic_rlx(&trace.init)) return; mtx_lock(&trace.lock); if (trace.event_count >= TRACE_BUFFER_SIZE) { + DEBUG_WARNING("Increase TRACE_BUFFER_SIZE\n"); mtx_unlock(&trace.lock); return; } From f61ca91f7cee9d1809c3bc21a1e69802fdad16cd Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Wed, 27 Sep 2023 18:08:10 +0200 Subject: [PATCH 2/4] increase buffer size and tmr interval --- src/trace/trace.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/trace/trace.c b/src/trace/trace.c index f34627f77..ec81a04e2 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -30,11 +30,11 @@ #endif #ifndef TRACE_BUFFER_SIZE -#define TRACE_BUFFER_SIZE 10000 +#define TRACE_BUFFER_SIZE 100000 #endif enum { - TRACE_FLUSH_TMR = 1000, + TRACE_FLUSH_TMR = 10000, }; #define DEBUG_MODULE "trace" @@ -106,6 +106,7 @@ static inline int get_process_id(void) static int flush_worker(void *arg) { (void)arg; + re_trace_flush(); return 0; From 371909b81bb593ba226be1580be664ac6f7dc0f2 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Wed, 27 Sep 2023 18:25:39 +0200 Subject: [PATCH 3/4] set trace.init false before deref --- src/trace/trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/trace/trace.c b/src/trace/trace.c index ec81a04e2..bf9641f79 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -199,14 +199,14 @@ int re_trace_close(void) #ifndef RE_TRACE_ENABLED return 0; #endif - tmr_cancel(&trace.flush_tmr); + tmr_cancel(&trace.flush_tmr); re_trace_flush(); + re_atomic_rlx_set(&trace.init, false); trace.event_buffer = mem_deref(trace.event_buffer); trace.event_buffer_flush = mem_deref(trace.event_buffer_flush); mtx_destroy(&trace.lock); - re_atomic_rlx_set(&trace.init, false); (void)re_fprintf(trace.f, "\n\t]\n}\n"); if (trace.f) From b4b268a1fa20cfa10b999db7f2aea0b72de4a954 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Fri, 29 Sep 2023 15:28:35 +0200 Subject: [PATCH 4/4] add TRACE_FLUSH_THRESHOLD --- src/trace/trace.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/trace/trace.c b/src/trace/trace.c index bf9641f79..d927953d7 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -29,17 +29,22 @@ #include #endif +#define DEBUG_MODULE "trace" +#define DEBUG_LEVEL 5 +#include + #ifndef TRACE_BUFFER_SIZE #define TRACE_BUFFER_SIZE 100000 #endif -enum { - TRACE_FLUSH_TMR = 10000, -}; +#ifndef TRACE_FLUSH_THRESHOLD +#define TRACE_FLUSH_THRESHOLD 1000 +#endif + +#ifndef TRACE_FLUSH_TMR +#define TRACE_FLUSH_TMR 1000 +#endif -#define DEBUG_MODULE "trace" -#define DEBUG_LEVEL 5 -#include struct trace_event { const char *name; @@ -107,6 +112,13 @@ static int flush_worker(void *arg) { (void)arg; + mtx_lock(&trace.lock); + if (trace.event_count < TRACE_FLUSH_THRESHOLD) { + mtx_unlock(&trace.lock); + return 0; + } + mtx_unlock(&trace.lock); + re_trace_flush(); return 0;