0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 from __future__ import print_function
0019
0020 import os
0021 import sys
0022 import math
0023 import struct
0024 import sqlite3
0025
0026 sys.path.append(os.environ['PERF_EXEC_PATH'] + \
0027 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
0028
0029 from perf_trace_context import *
0030 from EventClass import *
0031
0032
0033
0034
0035
0036
0037
0038 con = sqlite3.connect("/dev/shm/perf.db")
0039 con.isolation_level = None
0040
0041 def trace_begin():
0042 print("In trace_begin:\n")
0043
0044
0045
0046
0047
0048 con.execute("""
0049 create table if not exists gen_events (
0050 name text,
0051 symbol text,
0052 comm text,
0053 dso text
0054 );""")
0055 con.execute("""
0056 create table if not exists pebs_ll (
0057 name text,
0058 symbol text,
0059 comm text,
0060 dso text,
0061 flags integer,
0062 ip integer,
0063 status integer,
0064 dse integer,
0065 dla integer,
0066 lat integer
0067 );""")
0068
0069
0070
0071
0072
0073 def process_event(param_dict):
0074 event_attr = param_dict["attr"]
0075 sample = param_dict["sample"]
0076 raw_buf = param_dict["raw_buf"]
0077 comm = param_dict["comm"]
0078 name = param_dict["ev_name"]
0079
0080
0081 if ("dso" in param_dict):
0082 dso = param_dict["dso"]
0083 else:
0084 dso = "Unknown_dso"
0085
0086 if ("symbol" in param_dict):
0087 symbol = param_dict["symbol"]
0088 else:
0089 symbol = "Unknown_symbol"
0090
0091
0092 event = create_event(name, comm, dso, symbol, raw_buf)
0093 insert_db(event)
0094
0095 def insert_db(event):
0096 if event.ev_type == EVTYPE_GENERIC:
0097 con.execute("insert into gen_events values(?, ?, ?, ?)",
0098 (event.name, event.symbol, event.comm, event.dso))
0099 elif event.ev_type == EVTYPE_PEBS_LL:
0100 event.ip &= 0x7fffffffffffffff
0101 event.dla &= 0x7fffffffffffffff
0102 con.execute("insert into pebs_ll values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
0103 (event.name, event.symbol, event.comm, event.dso, event.flags,
0104 event.ip, event.status, event.dse, event.dla, event.lat))
0105
0106 def trace_end():
0107 print("In trace_end:\n")
0108
0109 show_general_events()
0110 show_pebs_ll()
0111 con.close()
0112
0113
0114
0115
0116
0117
0118 def num2sym(num):
0119
0120 snum = '#' * (int)(math.log(num, 2) + 1)
0121 return snum
0122
0123 def show_general_events():
0124
0125
0126 count = con.execute("select count(*) from gen_events")
0127 for t in count:
0128 print("There is %d records in gen_events table" % t[0])
0129 if t[0] == 0:
0130 return
0131
0132 print("Statistics about the general events grouped by thread/symbol/dso: \n")
0133
0134
0135 commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)")
0136 print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42))
0137 for row in commq:
0138 print("%16s %8d %s" % (row[0], row[1], num2sym(row[1])))
0139
0140
0141 print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58))
0142 symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)")
0143 for row in symbolq:
0144 print("%32s %8d %s" % (row[0], row[1], num2sym(row[1])))
0145
0146
0147 print("\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74))
0148 dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)")
0149 for row in dsoq:
0150 print("%40s %8d %s" % (row[0], row[1], num2sym(row[1])))
0151
0152
0153
0154
0155
0156
0157 def show_pebs_ll():
0158
0159 count = con.execute("select count(*) from pebs_ll")
0160 for t in count:
0161 print("There is %d records in pebs_ll table" % t[0])
0162 if t[0] == 0:
0163 return
0164
0165 print("Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n")
0166
0167
0168 commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)")
0169 print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42))
0170 for row in commq:
0171 print("%16s %8d %s" % (row[0], row[1], num2sym(row[1])))
0172
0173
0174 print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58))
0175 symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)")
0176 for row in symbolq:
0177 print("%32s %8d %s" % (row[0], row[1], num2sym(row[1])))
0178
0179
0180 dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)")
0181 print("\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58))
0182 for row in dseq:
0183 print("%32s %8d %s" % (row[0], row[1], num2sym(row[1])))
0184
0185
0186 latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat")
0187 print("\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58))
0188 for row in latq:
0189 print("%32s %8d %s" % (row[0], row[1], num2sym(row[1])))
0190
0191 def trace_unhandled(event_name, context, event_fields_dict):
0192 print (' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]))