xref: /spdk/test/blobfs/rocksdb/postprocess.py (revision 877573897ad52be4fa8989f7617bd655b87e05c4)
1#!/usr/bin/env python3
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2017 Intel Corporation
4#  All rights reserved.
5#
6
7from collections import namedtuple
8from itertools import islice
9import operator
10import sys
11
12total_samples = 0
13thread_module_samples = {}
14function_module_samples = {}
15module_samples = {}
16threads = set()
17
18ThreadModule = namedtuple('ThreadModule', ['thread', 'module'])
19FunctionModule = namedtuple('FunctionModule', ['function', 'module'])
20
21with open(sys.argv[1] + "/" + sys.argv[2] + ".perf.txt") as f:
22    for line in f:
23        fields = line.split()
24        total_samples += int(fields[1])
25        key = ThreadModule(fields[2], fields[3])
26        thread_module_samples.setdefault(key, 0)
27        thread_module_samples[key] += int(fields[1])
28        key = FunctionModule(fields[5], fields[3])
29        function_module_samples.setdefault(key, 0)
30        function_module_samples[key] += int(fields[1])
31        threads.add(fields[2])
32
33        key = fields[3]
34        module_samples.setdefault(key, 0)
35        module_samples[key] += int(fields[1])
36
37for thread in sorted(threads):
38    thread_pct = 0
39    print("")
40    print("Thread: {:s}".format(thread))
41    print(" Percent      Module")
42    print("============================")
43    for key, value in sorted(list(thread_module_samples.items()), key=operator.itemgetter(1), reverse=True):
44        if key.thread == thread:
45            print("{:8.4f}      {:20s}".format(float(value) * 100 / total_samples, key.module))
46            thread_pct += float(value) * 100 / total_samples
47    print("============================")
48    print("{:8.4f}       Total".format(thread_pct))
49
50print("")
51print(" Percent      Module               Function")
52print("=================================================================")
53for key, value in islice(sorted(list(function_module_samples.items()), key=operator.itemgetter(1), reverse=True), 100):
54    print(("{:8.4f}      {:20s} {:s}".format(float(value) * 100 / total_samples, key.module, key.function)))
55
56print("")
57print("")
58print(" Percent      Module")
59print("=================================")
60for key, value in sorted(list(module_samples.items()), key=operator.itemgetter(1), reverse=True):
61    print("{:8.4f}      {:s}".format(float(value) * 100 / total_samples, key))
62
63print("")
64with open(sys.argv[1] + "/" + sys.argv[2] + "_db_bench.txt") as f:
65    for line in f:
66        if "maxresident" in line:
67            fields = line.split()
68            print("Wall time elapsed: {:s}".format(fields[2].split("e")[0]))
69            print("CPU utilization: {:s}".format(fields[3].split('C')[0]))
70            user = float(fields[0].split('u')[0])
71            system = float(fields[1].split('s')[0])
72            print("User:   {:8.2f} ({:5.2f}%)".format(user, user * 100 / (user + system)))
73            print("System: {:8.2f} ({:5.2f}%)".format(system, system * 100 / (user + system)))
74
75print("")
76