[lttng-dev] [PATCH lttng-ust] Implement LTTNG_UST_BLOCKING_RETRY_TIMEOUT

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Fri Nov 4 14:27:07 UTC 2016



----- On Nov 4, 2016, at 8:13 AM, Jonathan Rajotte Jonathan.rajotte-julien at efficios.com 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 <mathieu.desnoyers at efficios.com>
>> ---
>>   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 <mathieu.desnoyers at efficios.com>
>> + * Copyright (C) 2012-2016 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
>>    *
>>    * 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
> lttng-dev at lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list