现在的位置: 首页 > 综合 > 正文

【Python运维脚本】查看各个进程读写的磁盘IO

2018年01月28日 ⁄ 综合 ⁄ 共 1435字 ⁄ 字号 评论关闭
#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2.6
#Author: leexide@126.com
# 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()

输出结果:

[root@oracle12c 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

抱歉!评论已关闭.