今天网上闲逛发现一python代码 类iotop 收藏之。
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com
import sys, os, time, signal, 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: ./iotop"
sys.exit(0)
if os.getuid() != 0:
print "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()
执行效果如下:
mysqld 13195 5 0
mysqld 12845 72 0
mysqld 12343 66 0
mysqld 33764 88 0
mysqld 17680 10 0
mysqld 12482 1 0
mysqld 13366 22 0
mysqld 4669 2 0
mysqld 14690 4 0
mysqld 14482 4 0
mysqld 13872 0 0
mysqld 40251 1 0
mysqld 14318 12 0
mysqld 17696 1 0
mysqld 13409 0 0
mysqld 40290 11 0
mysqld 17714 0 0
mysqld 8939 26 59
jbd2/sdb1-8 20794 0 26
mysqld 8924 0 1
mysqld 13051 2 0
mysqld 13352 0 0