From 06f08db39f2fd28bf7488f01cb463bcb2c965eb9 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 15 Aug 2023 22:20:17 +0200 Subject: [PATCH] Add new script. --- system-trace.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 system-trace.py diff --git a/system-trace.py b/system-trace.py new file mode 100755 index 0000000..3cfa282 --- /dev/null +++ b/system-trace.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 + +# The script makes a system trace based on Trace Event Format: +# https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview#heading=h.yr4qxyxotyw +# +# that can be opened in https://ui.perfetto.dev/ for inspection. + +import json +import time + +import psutil + + +OUTPUT_FILE = 'trace.json' +INTERVAL = 0.25 + +trace_data = [] + +# initial values +vm_initial = psutil.virtual_memory() +last_disk_counters = [0, 0] +last_net_counters = [0, 0] + +start = time.time() + + +def convert_time(t): + return t * 10**6 + + +try: + while True: + # CPU + cpu_percent = psutil.cpu_percent(percpu=False, interval=INTERVAL) + ts = convert_time(time.time()) + trace_data.append({'name': 'CPU usage', 'category': 'CPU', 'ph': 'C', + 'ts': ts, 'args': {'average': cpu_percent}}) + + # USED MEMORY + used = psutil.virtual_memory().used + trace_data.append({'name': 'Used memory', 'category': 'Memory', + 'ph': 'C', 'ts': ts, + 'args': {'bytes': max(0, used - vm_initial.used)}}) + + # DISK USAGE + disk_counters = psutil.disk_io_counters() + read_value = disk_counters.read_bytes + write_value = disk_counters.write_bytes + + first = last_disk_counters[0] == 0 + read_per_sec = (read_value - last_disk_counters[0]) / INTERVAL + write_per_sec = (write_value - last_disk_counters[1]) / INTERVAL + last_disk_counters = [read_value, write_value] + if not first: + trace_data.append({'name': 'Disk (bytes/s)', 'category': 'Disk', + 'ph': 'C', 'ts': ts, + 'args': {'read': read_per_sec, + 'write': write_per_sec}}) + # NETWORK USAGE + net_counters = psutil.net_io_counters() + received_value = net_counters.bytes_recv + sent_value = net_counters.bytes_sent + + first = last_net_counters[0] == 0 + received_per_sec = (received_value - last_net_counters[0]) / INTERVAL + sent_per_sec = (sent_value - last_net_counters[1]) / INTERVAL + last_net_counters = [received_value, sent_value] + if not first: + trace_data.append({'name': 'Network (bytes/s)', + 'category': 'Network', + 'ph': 'C', 'ts': ts, + 'args': {'received': received_per_sec, + 'sent': sent_per_sec}}) + + +except KeyboardInterrupt: + pass + +with open(OUTPUT_FILE, 'w') as f: + print(f'\nSaving output to: {OUTPUT_FILE}') + f.write(json.dumps({'traceEvents': trace_data}))