[libcamera-devel] [PATCH v3 5/6] utils: tracepoints: Add simple statistics script

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Oct 30 02:11:23 CET 2020


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 at 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 at 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))

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list