Message ID | 20201029101629.61798-6-paul.elder@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Paul, Thank you for the patch. On Thu, Oct 29, 2020 at 07:16:28PM +0900, Paul Elder wrote: > Add a script that scans a trace for IPA call tracepoints, and returns > statistics on the time taken for IPA calls. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > > --- > I'll fix output indentation in the next version. > > Changes in v3: > - check for the new tracepoint names, ipa_call_begin and ipa_call_end > - fix babeltrace2 parsing in the case that the event doesn't have a > pipeline_name field > - change script description > - add argparse description > - add example for trace_path argument > - change double quotes to single quotes > > New in v2 > --- > utils/tracepoints/analyze.py | 66 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > create mode 100755 utils/tracepoints/analyze.py > > diff --git a/utils/tracepoints/analyze.py b/utils/tracepoints/analyze.py > new file mode 100755 > index 00000000..43da9b1f > --- /dev/null > +++ b/utils/tracepoints/analyze.py I didn't notice when reviewing v2, but the script name seems very generic. Maybe analyze-ipa-trace.py ? With the alignment fix if you have time and think it's worth it, this will be good. > @@ -0,0 +1,66 @@ > +#!/usr/bin/env python3 > +# SPDX-License-Identifier: GPL-2.0-or-later > +# Copyright (C) 2020, Google Inc. > +# > +# Author: Paul Elder <paul.elder@ideasonboard.com> > +# > +# analyze.py - Example of how to extract information from libcamera lttng traces > + > +import argparse > +import bt2 > +import statistics as stats > +import sys > + > +# pipeline -> {function -> stack(timestamps)} > +timestamps = {} > + > +# pipeline:function -> samples[] > +samples = {} > + > +def main(argv): > + parser = argparse.ArgumentParser( > + description='A simple analysis script to get statistics on time taken for IPA calls') > + parser.add_argument('-p', '--pipeline', type=str, > + help='Name of pipeline to filter for') > + parser.add_argument('trace_path', type=str, > + help='Path to lttng trace (eg. ~/lttng-traces/demo-20201029-184003)') > + args = parser.parse_args(argv[1:]) > + > + traces = bt2.TraceCollectionMessageIterator(args.trace_path) > + for msg in traces: > + if type(msg) is not bt2._EventMessageConst or \ > + 'pipeline_name' not in msg.event.payload_field or \ > + (args.pipeline is not None and \ > + msg.event.payload_field['pipeline_name'] != args.pipeline): > + continue > + > + pipeline = msg.event.payload_field['pipeline_name'] > + event = msg.event.name > + func = msg.event.payload_field['function_name'] > + timestamp_ns = msg.default_clock_snapshot.ns_from_origin > + > + if event == 'libcamera:ipa_call_begin': > + if pipeline not in timestamps: > + timestamps[pipeline] = {} > + if func not in timestamps[pipeline]: > + timestamps[pipeline][func] = [] > + timestamps[pipeline][func].append(timestamp_ns) > + > + if event == 'libcamera:ipa_call_end': > + ts = timestamps[pipeline][func].pop() > + key = f'{pipeline}:{func}' > + if key not in samples: > + samples[key] = [] > + samples[key].append(timestamp_ns - ts) > + > + print('pipeline:function\t:\tmin\tmax\tmean\tstddev') > + for k, v in samples.items(): > + mean = int(stats.mean(v)) > + stddev = int(stats.stdev(v)) > + minv = min(v) > + maxv = max(v) > + print(f'{k}\t:\t{minv}\t{maxv}\t{mean}\t{stddev}') > + > + > +if __name__ == '__main__': > + sys.exit(main(sys.argv))
diff --git a/utils/tracepoints/analyze.py b/utils/tracepoints/analyze.py new file mode 100755 index 00000000..43da9b1f --- /dev/null +++ b/utils/tracepoints/analyze.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2020, Google Inc. +# +# Author: Paul Elder <paul.elder@ideasonboard.com> +# +# analyze.py - Example of how to extract information from libcamera lttng traces + +import argparse +import bt2 +import statistics as stats +import sys + +# pipeline -> {function -> stack(timestamps)} +timestamps = {} + +# pipeline:function -> samples[] +samples = {} + +def main(argv): + parser = argparse.ArgumentParser( + description='A simple analysis script to get statistics on time taken for IPA calls') + parser.add_argument('-p', '--pipeline', type=str, + help='Name of pipeline to filter for') + parser.add_argument('trace_path', type=str, + help='Path to lttng trace (eg. ~/lttng-traces/demo-20201029-184003)') + args = parser.parse_args(argv[1:]) + + traces = bt2.TraceCollectionMessageIterator(args.trace_path) + for msg in traces: + if type(msg) is not bt2._EventMessageConst or \ + 'pipeline_name' not in msg.event.payload_field or \ + (args.pipeline is not None and \ + msg.event.payload_field['pipeline_name'] != args.pipeline): + continue + + pipeline = msg.event.payload_field['pipeline_name'] + event = msg.event.name + func = msg.event.payload_field['function_name'] + timestamp_ns = msg.default_clock_snapshot.ns_from_origin + + if event == 'libcamera:ipa_call_begin': + if pipeline not in timestamps: + timestamps[pipeline] = {} + if func not in timestamps[pipeline]: + timestamps[pipeline][func] = [] + timestamps[pipeline][func].append(timestamp_ns) + + if event == 'libcamera:ipa_call_end': + ts = timestamps[pipeline][func].pop() + key = f'{pipeline}:{func}' + if key not in samples: + samples[key] = [] + samples[key].append(timestamp_ns - ts) + + print('pipeline:function\t:\tmin\tmax\tmean\tstddev') + for k, v in samples.items(): + mean = int(stats.mean(v)) + stddev = int(stats.stdev(v)) + minv = min(v) + maxv = max(v) + print(f'{k}\t:\t{minv}\t{maxv}\t{mean}\t{stddev}') + + +if __name__ == '__main__': + sys.exit(main(sys.argv))
Add a script that scans a trace for IPA call tracepoints, and returns statistics on the time taken for IPA calls. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> --- I'll fix output indentation in the next version. Changes in v3: - check for the new tracepoint names, ipa_call_begin and ipa_call_end - fix babeltrace2 parsing in the case that the event doesn't have a pipeline_name field - change script description - add argparse description - add example for trace_path argument - change double quotes to single quotes New in v2 --- utils/tracepoints/analyze.py | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 utils/tracepoints/analyze.py