interrupt count stcript
This commit is contained in:
61
monitor-interrupt-counts.py
Executable file
61
monitor-interrupt-counts.py
Executable file
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Monitor per-second interrupt counts for a specific interrupt type."""
|
||||
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
def parse_interrupts(filter_str):
|
||||
"""Parse /proc/interrupts and return counts for lines matching filter_str."""
|
||||
results = {}
|
||||
with open("/proc/interrupts") as f:
|
||||
header = f.readline().split()
|
||||
num_cpus = len(header)
|
||||
for line in f:
|
||||
if filter_str not in line:
|
||||
continue
|
||||
parts = line.split()
|
||||
label = parts[0].rstrip(":")
|
||||
counts = [int(parts[i + 1]) for i in range(num_cpus)]
|
||||
results[label] = counts
|
||||
return header, results
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print(f"Usage: {sys.argv[0]} <interrupt-type>", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
filter_str = sys.argv[1]
|
||||
cpu_names, prev = parse_interrupts(filter_str)
|
||||
|
||||
if not prev:
|
||||
print(f"No interrupts matching '{filter_str}' found in /proc/interrupts", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
num_cpus = len(cpu_names)
|
||||
print(f"Monitoring interrupts matching '{filter_str}' every 1s (Ctrl-C to stop)\n")
|
||||
|
||||
# Print header
|
||||
cpu_hdr = " ".join(f"{c:>8}" for c in cpu_names)
|
||||
print(f"{'IRQ':<20} {cpu_hdr} {'TOTAL':>10}")
|
||||
print("-" * (22 + num_cpus * 10 + 12))
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(1)
|
||||
_, curr = parse_interrupts(filter_str)
|
||||
for label in sorted(curr):
|
||||
if label not in prev:
|
||||
prev[label] = [0] * num_cpus
|
||||
deltas = [c - p for c, p in zip(curr[label], prev[label])]
|
||||
total = sum(deltas)
|
||||
cols = " ".join(f"{d:>8}" for d in deltas)
|
||||
print(f"{label:<20} {cols} {total:>10}")
|
||||
prev = curr
|
||||
except KeyboardInterrupt:
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user