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

Philippe Proulx eeppeliteloop at gmail.com
Fri Nov 4 14:51:55 UTC 2016


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).
+
--
`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


More information about the lttng-dev mailing list