On Tue, Mar 4, 2025 at 11:18 AM Dumitru Ceara <[email protected]> wrote:

> Add stopwatch counters to track how long the main thread "run()"
> function took for each of the types of statistics we track in
> ovn-controller.
>
> Today that is FDB and MAC_Binding stats:
>   > ovn-appctl stopwatch/show stats_FDB
>   Statistics for 'stats_FDB'
>     Total samples: 13
>     Maximum: 0 msec
>     Minimum: 0 msec
>     95th percentile: 0.000000 msec
>     Short term average: 0.000000 msec
>     Long term average: 0.000000 msec
>   > ovn-appctl stopwatch/show stats_MAC_BINDING
>   Statistics for 'stats_MAC_BINDING'
>     Total samples: 19
>     Maximum: 0 msec
>     Minimum: 0 msec
>     95th percentile: 0.000000 msec
>     Short term average: 0.000000 msec
>     Long term average: 0.000000 msec
>
> Signed-off-by: Dumitru Ceara <[email protected]>
> ---
>  controller/statctrl.c | 33 +++++++++++++++++++++------------
>  1 file changed, 21 insertions(+), 12 deletions(-)
>
> diff --git a/controller/statctrl.c b/controller/statctrl.c
> index d3c70ccba4..d555de36d0 100644
> --- a/controller/statctrl.c
> +++ b/controller/statctrl.c
> @@ -33,6 +33,7 @@
>  #include "seq.h"
>  #include "socket-util.h"
>  #include "statctrl.h"
> +#include "stopwatch.h"
>
>  VLOG_DEFINE_THIS_MODULE(statctrl);
>
> @@ -63,21 +64,27 @@ struct stats_node {
>      /* Function to process the parsed stats.
>       * This function runs in main thread locked behind mutex. */
>      void (*run)(struct ovs_list *stats_list, uint64_t *req_delay, void
> *data);
> +    /* Name of the stats node corresponding stopwatch. */
> +    const char *stopwatch_name;
>  };
>
>  #define STATS_NODE(NAME, REQUEST, DESTROY, PROCESS, RUN)
>  \
> -    statctrl_ctx.nodes[STATS_##NAME] = (struct stats_node) {
>  \
> -        .request = REQUEST,
>   \
> -        .xid = 0,
>   \
> -        .next_request_timestamp = INT64_MAX,
>  \
> -        .request_delay = 0,
>   \
> -        .stats_list =
>   \
> -            OVS_LIST_INITIALIZER(
>   \
> -                &statctrl_ctx.nodes[STATS_##NAME].stats_list),
>  \
> -        .destroy = DESTROY,
>   \
> -        .process_flow_stats = PROCESS,
>  \
> -        .run = RUN
>  \
> -    };
> +    do {
>  \
> +        statctrl_ctx.nodes[STATS_##NAME] = (struct stats_node) {
>  \
> +            .request = REQUEST,
>   \
> +            .xid = 0,
>   \
> +            .next_request_timestamp = INT64_MAX,
>  \
> +            .request_delay = 0,
>   \
> +            .stats_list =
>   \
> +                OVS_LIST_INITIALIZER(
>   \
> +                    &statctrl_ctx.nodes[STATS_##NAME].stats_list),
>  \
> +            .destroy = DESTROY,
>   \
> +            .process_flow_stats = PROCESS,
>  \
> +            .run = RUN,
>   \
> +            .stopwatch_name = OVS_STRINGIZE(stats_##NAME),
>  \
> +        };
>  \
> +        stopwatch_create(OVS_STRINGIZE(stats_##NAME), SW_MS);
>   \
> +    } while (0)
>
>  struct statctrl_ctx {
>      /* OpenFlow connection to the switch. */
> @@ -168,7 +175,9 @@ statctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn,
>          struct stats_node *node = &statctrl_ctx.nodes[i];
>          uint64_t prev_delay = node->request_delay;
>
> +        stopwatch_start(node->stopwatch_name, time_msec());
>          node->run(&node->stats_list, &node->request_delay, node_data[i]);
> +        stopwatch_stop(node->stopwatch_name, time_msec());
>
>          schedule_updated |=
>                  statctrl_update_next_request_timestamp(node, now,
> prev_delay);
> --
> 2.48.1
>
>
Looks good to me, thanks.

Acked-by: Ales Musil <[email protected]>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to