----- On Nov 4, 2016, at 8:13 AM, Jonathan Rajotte [email protected] wrote:
> On 2016-11-04 09:44 AM, Mathieu Desnoyers wrote: >> Add LTTNG_UST_BLOCKING_RETRY_TIMEOUT environment variable: >> >> LTTNG_UST_BLOCKING_RETRY_TIMEOUT >> Maximum time during which event tracing retry is attempted on >> buffer full condition (millliseconds). Setting this >> environment to non-zero value effectively blocks the >> application on buffer full condition. Setting this >> environment variable to non-zero values may significantly >> affect application timings. Setting this to a negative value >> may block the application indefinitely if there is no >> consumer emptying the ring buffer. This option can be useful >> in workloads generating very large trace data throughput, >> where blocking the application is an acceptable trade-off to >> not discard events. Use with caution. >> >> The value 0 means do not retry. The value -1 means retry >> forever. >> >> Default: 0. >> >> Signed-off-by: Mathieu Desnoyers <[email protected]> >> --- >> configure.ac | 2 ++ >> doc/man/Makefile.am | 4 +++- >> doc/man/lttng-ust.3.txt | 16 ++++++++++++++++ >> liblttng-ust/lttng-ust-comm.c | 19 ++++++++++++++++++- >> libringbuffer/Makefile.am | 2 +- >> libringbuffer/{tlsfixup.h => rb-init.h} | 11 ++++++----- >> libringbuffer/ring_buffer_frontend.c | 32 >> +++++++++++++++++++++++++++++++- >> 7 files changed, 77 insertions(+), 9 deletions(-) >> rename libringbuffer/{tlsfixup.h => rb-init.h} (71%) >> >> diff --git a/configure.ac b/configure.ac >> index 1add5d6..450b43b 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -435,6 +435,8 @@ AC_DEFUN([_AC_DEFINE_AND_SUBST], [ >> ]) >> >> _AC_DEFINE_AND_SUBST([LTTNG_UST_DEFAULT_CONSTRUCTOR_TIMEOUT_MS], [3000]) >> +# By default, do not retry on buffer full condition. >> +_AC_DEFINE_AND_SUBST([LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS], [0]) >> >> AC_CONFIG_FILES([ >> Makefile >> diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am >> index 22aed15..449377f 100644 >> --- a/doc/man/Makefile.am >> +++ b/doc/man/Makefile.am >> @@ -56,7 +56,9 @@ if HAVE_ASCIIDOC_XMLTO >> # Tools to execute: >> ADOC = $(ASCIIDOC) -f $(ASCIIDOC_CONF) -d manpage \ >> -a lttng_version="$(PACKAGE_VERSION)" \ >> - -a >> lttng_ust_register_timeout="@LTTNG_UST_DEFAULT_CONSTRUCTOR_TIMEOUT_MS@" >> + -a >> lttng_ust_register_timeout="@LTTNG_UST_DEFAULT_CONSTRUCTOR_TIMEOUT_MS@" \ >> + -a >> lttng_ust_blocking_retry_timeout="@LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS@" >> + >> ADOC_DOCBOOK = $(ADOC) -b docbook >> XTO = $(XMLTO) -m $(firstword $(XSL_SRC_FILES)) man >> >> diff --git a/doc/man/lttng-ust.3.txt b/doc/man/lttng-ust.3.txt >> index 7a23943..f918998 100644 >> --- a/doc/man/lttng-ust.3.txt >> +++ b/doc/man/lttng-ust.3.txt >> @@ -1123,6 +1123,22 @@ with time constraints on the process startup time. >> + >> Default: {lttng_ust_register_timeout}. >> >> +`LTTNG_UST_BLOCKING_RETRY_TIMEOUT`:: >> + Maximum time during which event tracing retry is attempted on buffer >> + full condition (millliseconds). Setting this environment to non-zero >> + value effectively blocks the application on buffer full condition. >> + Setting this environment variable to non-zero values may >> + significantly affect application timings. Setting this to a negative >> + value may block the application indefinitely if there is no consumer >> + emptying the ring buffer. This option can be useful in workloads >> + generating very large trace data throughput, where blocking the >> + application is an acceptable trade-off to not discard events. >> + _Use with caution_. >> ++ >> +The value `0` means _do not retry_. The value `-1` means _retry forever_. >> ++ >> +Default: {lttng_ust_blocking_retry_timeout}. >> + >> `LTTNG_UST_WITHOUT_BADDR_STATEDUMP`:: >> Prevents `liblttng-ust` from performing a base address state dump >> (see the <<state-dump,LTTng-UST state dump>> section above) if >> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c >> index 7cd6a22..ccdec65 100644 >> --- a/liblttng-ust/lttng-ust-comm.c >> +++ b/liblttng-ust/lttng-ust-comm.c >> @@ -52,7 +52,7 @@ >> #include "tracepoint-internal.h" >> #include "lttng-tracer-core.h" >> #include "compat.h" >> -#include "../libringbuffer/tlsfixup.h" >> +#include "../libringbuffer/rb-init.h" >> #include "lttng-ust-statedump.h" >> #include "clock.h" >> #include "../libringbuffer/getcpu.h" >> @@ -534,6 +534,21 @@ int get_constructor_timeout(struct timespec >> *constructor_timeout) >> } >> >> static >> +void get_blocking_retry_timeout(void) >> +{ >> + const char *str_blocking_retry_timeout = >> + getenv("LTTNG_UST_BLOCKING_RETRY_TIMEOUT"); >> + >> + if (str_blocking_retry_timeout) { >> + long timeout = strtol(str_blocking_retry_timeout, NULL, 10); >> + >> + if (timeout < 0) >> + timeout = -1; >> + lttng_ust_ringbuffer_set_retry_timeout(timeout); >> + } >> +} >> + >> +static >> int register_to_sessiond(int socket, enum ustctl_socket_type type) >> { >> return ustcomm_send_reg_msg(socket, >> @@ -1672,6 +1687,8 @@ void __attribute__((constructor)) lttng_ust_init(void) >> >> timeout_mode = get_constructor_timeout(&constructor_timeout); >> >> + get_blocking_retry_timeout(); >> + >> ret = sem_init(&constructor_wait, 0, 0); >> if (ret) { >> PERROR("sem_init"); >> diff --git a/libringbuffer/Makefile.am b/libringbuffer/Makefile.am >> index 271c8be..33db165 100644 >> --- a/libringbuffer/Makefile.am >> +++ b/libringbuffer/Makefile.am >> @@ -11,7 +11,7 @@ libringbuffer_la_SOURCES = \ >> api.h \ >> backend.h backend_internal.h backend_types.h \ >> frontend_api.h frontend.h frontend_internal.h frontend_types.h \ >> - nohz.h vatomic.h tlsfixup.h >> + nohz.h vatomic.h rb-init.h >> >> libringbuffer_la_LIBADD = \ >> -lpthread \ >> diff --git a/libringbuffer/tlsfixup.h b/libringbuffer/rb-init.h >> similarity index 71% >> rename from libringbuffer/tlsfixup.h >> rename to libringbuffer/rb-init.h >> index 125742e..eba087f 100644 >> --- a/libringbuffer/tlsfixup.h >> +++ b/libringbuffer/rb-init.h >> @@ -1,10 +1,10 @@ >> -#ifndef _LTTNG_UST_LIB_RINGBUFFER_TLS_FIXUP_H >> -#define _LTTNG_UST_LIB_RINGBUFFER_TLS_FIXUP_H >> +#ifndef _LTTNG_UST_LIB_RINGBUFFER_RB_INIT_H >> +#define _LTTNG_UST_LIB_RINGBUFFER_RB_INIT_H >> >> /* >> - * libringbuffer/tlsfixup.h >> + * libringbuffer/rb-init.h >> * >> - * Copyright (C) 2012 Mathieu Desnoyers <[email protected]> >> + * Copyright (C) 2012-2016 Mathieu Desnoyers >> <[email protected]> >> * >> * This library is free software; you can redistribute it and/or >> * modify it under the terms of the GNU Lesser General Public >> @@ -22,5 +22,6 @@ >> */ >> >> void lttng_fixup_ringbuffer_tls(void); >> +void lttng_ust_ringbuffer_set_retry_timeout(int timeout); >> >> -#endif /* _LTTNG_UST_LIB_RINGBUFFER_TLS_FIXUP_H */ >> +#endif /* _LTTNG_UST_LIB_RINGBUFFER_RB_INIT_H */ >> diff --git a/libringbuffer/ring_buffer_frontend.c >> b/libringbuffer/ring_buffer_frontend.c >> index be20d69..c062e0c 100644 >> --- a/libringbuffer/ring_buffer_frontend.c >> +++ b/libringbuffer/ring_buffer_frontend.c >> @@ -72,7 +72,7 @@ >> #include "backend.h" >> #include "frontend.h" >> #include "shm.h" >> -#include "tlsfixup.h" >> +#include "rb-init.h" >> #include "../liblttng-ust/compat.h" /* For ENODATA */ >> >> /* Print DBG() messages about events lost only every 1048576 hits */ >> @@ -84,6 +84,7 @@ >> #define CLOCKID CLOCK_MONOTONIC >> #define LTTNG_UST_RING_BUFFER_GET_RETRY 10 >> #define LTTNG_UST_RING_BUFFER_RETRY_DELAY_MS 10 >> +#define RETRY_DELAY 100 /* 100 ms. */ > Nitpicking: > > Should this be RETRY_DELAY_MS since other name scheme use the *_MS suffix ? > > e.g: > LTTNG_UST_RING_BUFFER_RETRY_DELAY_MS > CONFIG_LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS > timeout_left_ms Yes, will fix for v3. Thanks, Mathieu > >> >> /* >> * Non-static to ensure the compiler does not optimize away the xor. >> @@ -149,6 +150,14 @@ static struct timer_signal_data timer_signal = { >> .lock = PTHREAD_MUTEX_INITIALIZER, >> }; >> >> +int lttng_ust_blocking_retry_timeout = >> + CONFIG_LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS; >> + >> +void lttng_ust_ringbuffer_set_retry_timeout(int timeout) >> +{ >> + lttng_ust_blocking_retry_timeout = timeout; >> +} >> + >> /** >> * lib_ring_buffer_reset - Reset ring buffer to initial values. >> * @buf: Ring buffer. >> @@ -1985,6 +1994,23 @@ void lib_ring_buffer_switch_slow(struct >> lttng_ust_lib_ring_buffer *buf, enum swi >> lib_ring_buffer_switch_old_end(buf, chan, &offsets, tsc, handle); >> } >> >> +static >> +bool handle_blocking_retry(int *timeout_left_ms) >> +{ >> + int timeout = *timeout_left_ms, delay; >> + >> + if (caa_likely(!timeout)) >> + return false; /* Do not retry, discard event. */ >> + if (timeout < 0) /* Wait forever. */ >> + delay = RETRY_DELAY; >> + else >> + delay = min_t(int, timeout, RETRY_DELAY); >> + (void) poll(NULL, 0, delay); >> + if (timeout > 0) >> + *timeout_left_ms -= delay; >> + return true; /* Retry. */ >> +} >> + >> /* >> * Returns : >> * 0 if ok >> @@ -2001,6 +2027,7 @@ int lib_ring_buffer_try_reserve_slow(struct >> lttng_ust_lib_ring_buffer *buf, >> const struct lttng_ust_lib_ring_buffer_config *config = >> &chan->backend.config; >> struct lttng_ust_shm_handle *handle = ctx->handle; >> unsigned long reserve_commit_diff, offset_cmp; >> + int timeout_left_ms = lttng_ust_blocking_retry_timeout; >> >> retry: >> offsets->begin = offset_cmp = v_read(config, &buf->offset); >> @@ -2083,6 +2110,9 @@ retry: >> >= chan->backend.buf_size)) { >> unsigned long nr_lost; >> >> + if (handle_blocking_retry(&timeout_left_ms)) >> + goto retry; >> + >> /* >> * We do not overwrite non consumed buffers >> * and we are full : record is lost. > > -- > Jonathan R. Julien > Efficios > > _______________________________________________ > lttng-dev mailing list > [email protected] > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
