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