#!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2.6 #Author: [email protected] # Monitoring per-process disk I/O activity import sys import os import time import signal import re class DiskIO: def __init__(self, pname=None, pid=None, reads=0, writes=0): self.pname = pname self.pid = pid self.reads = 0 self.writes = 0 def main(): argc = len(sys.argv) if argc != 1: print "usage: please run this script like [./diskio.py]" sys.exit(0) if os.getuid() != 0: print "Error: This script must be run as root" sys.exit(0) signal.signal(signal.SIGINT, signal_handler) os.system(‘echo 1 > /proc/sys/vm/block_dump‘) print "TASK PID READ WRITE" while True: os.system(‘dmesg -c > /tmp/diskio.log‘) l = [] f = open(‘/tmp/diskio.log‘, ‘r‘) line = f.readline() while line: m = re.match( ‘^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)‘, line) if m != None: if not l: l.append(DiskIO(m.group(1), m.group(2))) line = f.readline() continue found = False for item in l: if item.pid == m.group(2): found = True if m.group(3) == "READ": item.reads = item.reads + 1 elif m.group(3) == "WRITE": item.writes = item.writes + 1 if not found: l.append(DiskIO(m.group(1), m.group(2))) line = f.readline() time.sleep(1) for item in l: print "%-10s %10s %10d %10d" % (item.pname, item.pid, item.reads, item.writes) def signal_handler(signal, frame): os.system(‘echo 0 > /proc/sys/vm/block_dump‘) sys.exit(0) if __name__=="__main__": main()
输出结果:
[[email protected] python]# ./diskio.py TASK PID READ WRITE dmesg 3018 0 0 dmesg 3170 0 0 dmesg 3172 0 0 jbd2/sda6-8 330 0 3 dmesg 3174 0 0 dmesg 3177 0 0 dmesg 3179 0 0 jbd2/sda3-8 1040 0 4 jbd2/sda3-8 1040 0 0 dmesg 3181 0 0 dmesg 3183 0 0 jbd2/sda6-8 330 0 2
时间: 2024-10-16 12:55:28