linux查看过高进程,linux下查看使用硬盘IO过高的进程

服务器cpu使用率不高,load比较高,所以要查看一下IO。硬盘IO可以通过命令vmstat或iostat获得(也可以用yum 安装dstat获得),网络IO可以用iftop命令获取。但是不知道那个进程使用硬盘IO比较高,通过查找没有找到相关命令,只好自己写个脚本进行统计处理。

本脚本在CentOS6下(kernel2.6以上)python2.6测试通过。

直接运行脚本,默认情况下收集3秒钟数据,显示读写最高的前三个进程。如用参数可以使用命令“python fhip.py 4 5 3”,第一个数位每次收集读写数据的间隔秒数,第二个数是打印出读写最多的n个进程,第三个为运行脚本的次数。因为参数部分写的比较简单那,所以用参数必须3个全写。

#!/bin/python

#-*- coding:utf-8 -*-

# Filename: find_high_io_process

# Revision: 1.0

# Date: 2013-3-8

# Author: simonzhang

# web: www.simonzhang.net

# Email: simon-zzm@163.com

### END INIT INFO

import os

import re

import sys

import time

from string import strip

####

sys_proc_path = '/proc/'

re_find_process_number = '^\d+$'

####

# 通过/proc/$pid/io获取读写信息

####

def collect_info():

_tmp = {}

re_find_process_dir = re.compile(re_find_process_number)

for i in os.listdir(sys_proc_path):

if re_find_process_dir.search(i):

# 获得进程名

process_name = open("%s%s/stat" % (sys_proc_path, i), "rb").read().split(" ")[1]

# 读取io信息

rw_io = open("%s%s/io" % (sys_proc_path, i), "rb").readlines()

for _info in rw_io:

cut_info = strip(_info).split(':')

if strip(cut_info[0]) == "read_bytes":

read_io = int(strip(cut_info[1]))

if strip(cut_info[0]) == "write_bytes":

write_io = int(strip(cut_info[1]))

_tmp[i] = {"name":process_name, "read_bytes":read_io, "write_bytes":write_io}

return _tmp

def main(_sleep_time, _list_num):

_sort_read_dict = {}

_sort_write_dict = {}

# 获取系统读写数据

process_info_list_frist = collect_info()

time.sleep(_sleep_time)

process_info_list_second = collect_info()

# 将读数据和写数据进行分组,写入两个字典中

for loop in process_info_list_second.keys():

second_read_v = process_info_list_second[loop]["read_bytes"]

second_write_v = process_info_list_second[loop]["write_bytes"]

try:

frist_read_v = process_info_list_frist[loop]["read_bytes"]

except:

frist_read_v = 0

try:

frist_write_v = process_info_list_frist[loop]["write_bytes"]

except:

frist_write_v = 0

# 计算第二次获得数据域第一次获得数据的差

_sort_read_dict[loop] = second_read_v - frist_read_v

_sort_write_dict[loop] = second_write_v - frist_write_v

# 将读写数据进行排序

sort_read_dict = sorted(_sort_read_dict.items(),key=lambda _sort_read_dict:_sort_read_dict[1],reverse=True)

sort_write_dict = sorted(_sort_write_dict.items(),key=lambda _sort_write_dict:_sort_write_dict[1],reverse=True)

# 打印统计结果

print "pid process read(bytes) pid process write(btyes)"

for _num in range(_list_num):

read_pid = sort_read_dict[_num][0]

write_pid = sort_write_dict[_num][0]

res = "%s" % read_pid

res += " " * (8 - len(read_pid)) + process_info_list_second[read_pid]["name"]

res += " " * (12 - len(process_info_list_second[read_pid]["name"])) + "%s" % sort_read_dict[_num][1]

res += " " * (12 - len("%s" % sort_read_dict[_num][1])) + write_pid

res += " " * (8 - len(write_pid)) + process_info_list_second[write_pid]["name"]

res += " " * (12 - len("%s" % process_info_list_second[write_pid]["name"])) + "%s" % sort_write_dict[_num][1]

print res

print "\n" * 1

if __name__ == '__main__':

try:

_sleep_time = sys.argv[1]

except:

_sleep_time = 3

try:

_num = sys.argv[2]

except:

_num = 3

try:

loop = sys.argv[3]

except:

loop = 1

for i in range(int(loop)):

main(int(_sleep_time), int(_num))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值