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

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Fri Nov 4 15:07:23 UTC 2016


----- On Nov 4, 2016, at 8:51 AM, Philippe Proulx eeppeliteloop at gmail.com wrote:

> On Fri, Nov 4, 2016 at 9:44 AM, Mathieu Desnoyers
> <mathieu.desnoyers at efficios.com> wrote:
>> +`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_.
> 
> Try:
> 
> `LTTNG_UST_BLOCKING_RETRY_TIMEOUT`::
>    Maximum duration (milliseconds) to retry event tracing when
>    there's no space left for the event record in the sub-buffer
>    (millliseconds).

Removed the second (milliseconds) (repetition).

Taken as is otherwise.

Thanks,

Mathieu

> +
> --
> `0` (default)::
>    Never block the application.
> 
> Positive value::
>    Block the application for the specified number of milliseconds. If
>    there's no space left after this duration, discard the event
>    record.
> 
> Negative value::
>    Block the application until there's space left for the event record.
> --
> +
> This option can be useful in workloads generating very large trace data
> throughput, where blocking the application is an acceptable trade-off to
> prevent discarding event records.
> +
> WARNING: Setting this environment variable to a non-zero value may
> significantly affect application timings.
> 
> Also, put this block above the description of `LTTNG_UST_CLOCK_PLUGIN`,
> as environment variables are sorted by name.
> 
> Phil
> 
>> ++
>> +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. */
>>
>>  /*
>>   * 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.
>> --
>> 2.1.4
>>
>> _______________________________________________
>> lttng-dev mailing list
>> lttng-dev at lists.lttng.org
>> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> _______________________________________________
> 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