From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org,
boost.lists@gmail.com, quintela@redhat.com, jasowang@redhat.com,
mst@redhat.com, zuban32s@gmail.com,
maria.klimushenkova@ispras.ru, dovgaluk@ispras.ru,
kraxel@redhat.com, pavel.dovgaluk@ispras.ru, pbonzini@redhat.com,
alex.bennee@linaro.org
Subject: [Qemu-devel] [RFC PATCH v2 24/26] scripts/analyse-locks-simpletrace.py: script to analyse lock times
Date: Tue, 14 Nov 2017 11:18:46 +0300 [thread overview]
Message-ID: <20171114081846.27640.12424.stgit@pasha-VirtualBox> (raw)
In-Reply-To: <20171114081630.27640.53933.stgit@pasha-VirtualBox>
From: Alex Bennée <alex.bennee@linaro.org>
This script allows analysis of mutex acquisition and hold times based
on a trace file. Given a trace control file of:
qemu_mutex_lock
qemu_mutex_locked
qemu_mutex_unlock
And running with:
$QEMU $QEMU_ARGS -trace events=./lock-trace
You can analyse the results with:
./scripts/analyse-locks-simpletrace.py trace-events-all ./trace-21812
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/analyse-locks-simpletrace.py | 99 ++++++++++++++++++++++++++++++++++
1 file changed, 99 insertions(+)
create mode 100755 scripts/analyse-locks-simpletrace.py
diff --git a/scripts/analyse-locks-simpletrace.py b/scripts/analyse-locks-simpletrace.py
new file mode 100755
index 0000000..b72c951
--- /dev/null
+++ b/scripts/analyse-locks-simpletrace.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Analyse lock events and
+#
+# Author: Alex Bennée <alex.bennee@linaro.org>
+#
+
+import os
+import simpletrace
+import argparse
+import numpy as np
+
+class MutexAnalyser(simpletrace.Analyzer):
+ "A simpletrace Analyser for checking locks."
+
+ def __init__(self):
+ self.locks = 0
+ self.locked = 0
+ self.unlocks = 0
+ self.mutex_records = {}
+
+ def _get_mutex(self, mutex):
+ if not mutex in self.mutex_records:
+ self.mutex_records[mutex] = {"locks": 0,
+ "lock_time": 0,
+ "acquire_times": [],
+ "locked": 0,
+ "locked_time": 0,
+ "held_times": [],
+ "unlocked": 0}
+
+ return self.mutex_records[mutex]
+
+ def qemu_mutex_lock(self, timestamp, mutex, filename, line):
+ self.locks += 1
+ rec = self._get_mutex(mutex)
+ rec["locks"] += 1
+ rec["lock_time"] = timestamp[0]
+ rec["lock_loc"] = (filename, line)
+
+ def qemu_mutex_locked(self, timestamp, mutex, filename, line):
+ self.locked += 1
+ rec = self._get_mutex(mutex)
+ rec["locked"] += 1
+ rec["locked_time"] = timestamp[0]
+ acquire_time = rec["locked_time"] - rec["lock_time"]
+ rec["locked_loc"] = (filename, line)
+ rec["acquire_times"].append(acquire_time)
+
+ def qemu_mutex_unlock(self, timestamp, mutex, filename, line):
+ self.unlocks += 1
+ rec = self._get_mutex(mutex)
+ rec["unlocked"] += 1
+ held_time = timestamp[0] - rec["locked_time"]
+ rec["held_times"].append(held_time)
+ rec["unlock_loc"] = (filename, line)
+
+
+def get_args():
+ "Grab options"
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--output", "-o", type=str, help="Render plot to file")
+ parser.add_argument("events", type=str, help='trace file read from')
+ parser.add_argument("tracefile", type=str, help='trace file read from')
+ return parser.parse_args()
+
+if __name__ == '__main__':
+ args = get_args()
+
+ # Gather data from the trace
+ analyser = MutexAnalyser()
+ simpletrace.process(args.events, args.tracefile, analyser)
+
+ print ("Total locks: %d, locked: %d, unlocked: %d" %
+ (analyser.locks, analyser.locked, analyser.unlocks))
+
+ # Now dump the individual lock stats
+ for key, val in sorted(analyser.mutex_records.iteritems(),
+ key=lambda (k,v): v["locks"]):
+ print ("Lock: %#x locks: %d, locked: %d, unlocked: %d" %
+ (key, val["locks"], val["locked"], val["unlocked"]))
+
+ acquire_times = np.array(val["acquire_times"])
+ if len(acquire_times) > 0:
+ print (" Acquire Time: min:%d median:%d avg:%.2f max:%d" %
+ (acquire_times.min(), np.median(acquire_times),
+ acquire_times.mean(), acquire_times.max()))
+
+ held_times = np.array(val["held_times"])
+ if len(held_times) > 0:
+ print (" Held Time: min:%d median:%d avg:%.2f max:%d" %
+ (held_times.min(), np.median(held_times),
+ held_times.mean(), held_times.max()))
+
+ # Check if any locks still held
+ if val["locks"] > val["locked"]:
+ print (" LOCK HELD (%s:%s)" % (val["locked_loc"]))
+ print (" BLOCKED (%s:%s)" % (val["lock_loc"]))
next prev parent reply other threads:[~2017-11-14 8:18 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-14 8:16 [Qemu-devel] [RFC PATCH v2 00/26] replay additions Pavel Dovgalyuk
2017-11-14 8:16 ` [Qemu-devel] [RFC PATCH v2 01/26] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2017-11-14 8:16 ` [Qemu-devel] [RFC PATCH v2 02/26] blkreplay: create temporary overlay for underlaying devices Pavel Dovgalyuk
2017-11-14 8:16 ` [Qemu-devel] [RFC PATCH v2 03/26] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2017-11-14 8:16 ` [Qemu-devel] [RFC PATCH v2 04/26] replay: fix processing async events Pavel Dovgalyuk
2017-11-14 13:34 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 05/26] replay: fixed replay_enable_events Pavel Dovgalyuk
2017-11-14 13:34 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 06/26] replay: fix save/load vm for non-empty queue Pavel Dovgalyuk
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 07/26] replay: added replay log format description Pavel Dovgalyuk
2017-11-14 13:34 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 08/26] replay: make safe vmstop at record/replay Pavel Dovgalyuk
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 09/26] replay: save prior value of the host clock Pavel Dovgalyuk
2017-11-14 13:35 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 10/26] icount: fixed saving/restoring of icount warp timers Pavel Dovgalyuk
2017-11-14 13:35 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 11/26] target/arm/arm-powertctl: drop BQL assertions Pavel Dovgalyuk
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 12/26] cpus: push BQL lock to qemu_*_wait_io_event Pavel Dovgalyuk
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 13/26] cpus: only take BQL for sleeping threads Pavel Dovgalyuk
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 14/26] replay/replay.c: bump REPLAY_VERSION again Pavel Dovgalyuk
2017-11-14 13:35 ` Paolo Bonzini
2017-11-14 8:17 ` [Qemu-devel] [RFC PATCH v2 15/26] replay/replay-internal.c: track holding of replay_lock Pavel Dovgalyuk
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 16/26] replay: make locking visible outside replay code Pavel Dovgalyuk
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 17/26] replay: push replay_mutex_lock up the call tree Pavel Dovgalyuk
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 18/26] cpu-exec: don't overwrite exception_index Pavel Dovgalyuk
2017-11-14 13:37 ` Paolo Bonzini
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache Pavel Dovgalyuk
2017-11-14 13:38 ` Paolo Bonzini
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 20/26] replay: don't destroy mutex at exit Pavel Dovgalyuk
2017-11-14 13:36 ` Paolo Bonzini
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 21/26] replay: check return values of fwrite Pavel Dovgalyuk
2017-11-14 13:37 ` Paolo Bonzini
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 22/26] scripts/qemu-gdb: add simple tcg lock status helper Pavel Dovgalyuk
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 23/26] util/qemu-thread-*: add qemu_lock, locked and unlock trace events Pavel Dovgalyuk
2017-11-14 8:18 ` Pavel Dovgalyuk [this message]
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 25/26] scripts/replay-dump.py: replay log dumper Pavel Dovgalyuk
2017-11-14 8:18 ` [Qemu-devel] [RFC PATCH v2 26/26] scripts/qemu-gdb/timers.py: new helper to dump timer state Pavel Dovgalyuk
2017-11-14 8:58 ` [Qemu-devel] [RFC PATCH v2 00/26] replay additions no-reply
2017-11-14 9:03 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171114081846.27640.12424.stgit@pasha-VirtualBox \
--to=pavel.dovgaluk@ispras.ru \
--cc=alex.bennee@linaro.org \
--cc=boost.lists@gmail.com \
--cc=dovgaluk@ispras.ru \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=maria.klimushenkova@ispras.ru \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=zuban32s@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).