From patchwork Wed Oct 28 10:31:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 10291 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id B1B5CBDB1E for ; Wed, 28 Oct 2020 10:32:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7F66B625F9; Wed, 28 Oct 2020 11:32:12 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ICa8DWQW"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CDA33625F9 for ; Wed, 28 Oct 2020 11:32:09 +0100 (CET) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 45DA799A; Wed, 28 Oct 2020 11:32:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1603881129; bh=zFRmPxhWd2ZJKQXD7T3TbMRoyG3X0kE1R0Hff/julZY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ICa8DWQWXrGsPHDHc2H3auzDU0LxPk3CNg6mNWZoLqYMkDvwl8gouZJLNXaOP9YY/ ESquJdFI4ZnsliDPIfsO1GnOkKWHY1E7j5Typovn4hbrcEHk0j5/EenJxs9W1MTZEu jU9rzbzB8t1T8o3PdcY+vqzUn/gF0VmgwY6xYjXU= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 28 Oct 2020 19:31:50 +0900 Message-Id: <20201028103151.34575-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201028103151.34575-1-paul.elder@ideasonboard.com> References: <20201028103151.34575-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 5/6] utils: tracepoints: Add simple statistics script X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 --- New in v2 --- utils/tracepoints/analyze.py | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 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..be56ca28 --- /dev/null +++ b/utils/tracepoints/analyze.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2020, Google Inc. +# +# Author: Paul Elder +# +# analyze.py - Analysis tool for libcamera lttng output + +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() + 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') + args = parser.parse_args(argv[1:]) + + traces = bt2.TraceCollectionMessageIterator(args.trace_path) + for msg in traces: + if type(msg) is not bt2._EventMessageConst 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_start': + 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_finish': + 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))