On Mon, Jan 23, 2023 at 11:28:45AM +0100, Eelco Chaudron wrote:
>
>
> On 19 Jan 2023, at 11:38, Simon Horman wrote:
>
> > On Tue, Jan 17, 2023 at 10:19:23AM +0100, Eelco Chaudron wrote:
> >> This patch adds a Python script that can be used to analyze the
> >> revalidator runs by providing statistics (including some real time
> >> graphs).
> >>
> >> The USDT events can also be captured to a file and used for
> >> later offline analysis.
> >>
> >> The following blog explains the Open vSwitch revalidator
> >> implementation and how this tool can help you understand what is
> >> happening in your system.
> >>
> >> https://developers.redhat.com/articles/2022/10/19/open-vswitch-revalidator-process-explained
> >>
> >> Signed-off-by: Eelco Chaudron <[email protected]>
> >
> > Thanks Eelco,
> >
> > this looks very nice.
> >
> > A few minor nits from my side, but that not withstanding.
> >
> > Acked-by: Simon Horman <[email protected]>
> >
>
> Thanks for looking into this Simon!
>
> I will send out a v8 with some of your changes, and one addition to
> auto-generate the ENUMS so the are synced between eBPF and python.
>
> See inline comments below…
Thanks, much appreciated.
> >> +def _process_event(event):
> >> + global graph
> >> +
> >> + if export_file is not None:
> >> + export_file.write("event = {}\n".format(event_to_dict(event)))
> >> +
> >> + if event.id == 0 and not state['running']:
> >> + start = state["last_start"]
> >> + done = state["last_done"]
> >> + if done and start:
> >> + actual_wait = (event.ts - done.ts) / 1000000
> >> + csv = "{}, {}, {}, {}, {}, {}, {}, {}, {}, {:.2f}".format(
> >> + start.ts, done.ts, done.n_flows, graph.ukey_count,
> >> + done.avg_n_flows, done.max_n_flows, done.flow_limit,
> >> + done.dump_duration, done.poll_wait, actual_wait)
> >> +
> >> + if graph.base_time == 0:
> >> + graph = graph._replace(base_time=done.ts)
> >> +
> >> + graph.time.append((done.ts - graph.base_time) / 1000000000)
> >> + graph.n_flows.append(done.n_flows)
> >> + graph.n_reval_flows.append(graph.ukey_count)
> >> + graph.avg_n_flows.append(done.avg_n_flows)
> >> + graph.max_n_flows.append(done.max_n_flows)
> >> + graph.flow_limit.append(done.flow_limit)
> >> + graph.dump_duration.append(done.dump_duration)
> >> + graph.poll_wait.append(done.poll_wait)
> >> + graph.actual_wait.append(actual_wait)
> >> +
> >> + if not options.no_gui and not options.no_realtime_plots:
> >> + updated_graph = dynamic_plot_update(
> >> + graph, refresh=options.update_interval)
> >> + if updated_graph is None:
> >> + raise KeyboardInterrupt
> >> + graph = updated_graph
> >> +
> >> + if options.compress_output:
> >> + last_csv = state["last_csv"]
> >> + if not last_csv or \
> >> + csv.split(",")[2:-1] != last_csv.split(",")[2:-1] or \
> >> + abs((event.ts - done.ts) / 1000000 - done.poll_wait) >
> >> 100:
> >> + print(csv)
> >> + else:
> >> + state["last_not_printed_csv"] = csv
> >> +
> >> + state["last_csv"] = csv
> >> + else:
> >> + print(csv)
> >
> > nit: maybe it is nicer to store csv as a tuple and provide
> > a helper to print it? (Maybe not :)
>
> I’ve decided to keep it as is for now, as else we need to define the tuple
> instead of the string so there will not be much difference.
Sure, this was the suggestion that I was most unsure about.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev