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:    ind_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))


如若满意,请点击【采纳答案】,如若还有问题,请点击【追问】


希望我的回答对您有所帮助,望采纳!


                                                                                                                          ~ O(∩_∩)O~

1.使用iotop命令

使用该命令有个条件,Linux内核要高于2.6.20的版本,版本过低则没有此命令,执行效果如下图所示:

2:block_dump方法


首先,关闭syslog服务,然后开启block_dump,最后正则表达式提取dmesg信息。

/etc/init.d/syslog stop                     

echo 1 > /proc/sys/vm/block_dump

dmesg | egrep "READ|WRITE|dirtied" | egrep -o ([a-zA-Z]*) | sort | uniq -c | sort -rn | head

执行结果如下图所示:

注意:操作完成后请关闭block_dump和启动syslog

echo 0 > /proc/sys/vm/block_dump       #关闭block_dump

/etc/init.d/syslog start                             #启动syslog

装上iotop, 或者dstat, 用他们看.
个人比较喜欢iotopCtrl+T
TOP
喜欢阅读
  • 美女总裁贴身高手

    美女总裁贴身高手

    从山上下来的神秘少年,为寻找未婚妻而展现出神秘莫测的本领,美女总裁倒追,校花要当小蜜,这些都不是幻想,“都想当我老婆,你以为谁都有资格么?”“身材不好不要,长得不倾国倾城不要,没有才艺不要,不能忍受我三妻四妾?这更不要。”一路嬉笑怒骂,受尽羡慕嫉妒恨故事就在护花路上。。。

  • 总裁的贴身特助

    总裁的贴身特助

    一场奇葩的面试,她获得了双重身份,工作日她是朝五晚九忙到脚打后脑勺的房产部女售楼,休息日她是披荆斩棘帮上司‘擦屁股’的生活女特助。他们说好只谈交易不谈感情,可突然有一天,他却对她做了出格的事……“商总,你越线了!”“这是公平交易,你用了我的东西,我也用了你的。”

  • 呆萌娇妻惹不起

    呆萌娇妻惹不起

    她左希染是谁?专业驱三师处理各种私人问题,曾是响当当的国际大盗!可没想到在一次执行任务的时候进错房间抓错人,把华国老独子,人人闻风丧胆的宋琛易当成小三!初次见面就针锋相对,败在他手下和身下,最后竟被迫做了他名义上的情人,从此两人展开相爱相杀的道路……

  • 暴力娘亲选夫记

    暴力娘亲选夫记

    当丑女变凤凰,四国美貌第一,才能第一,指挥第一。那求亲的人如滔滔流水,生过孩子,没关系,娶大送小,很划算;暴力有虐待男人的习惯,没关系,咱都是皮糙肉厚的人,很扛打;要上战场,没关系,正是要娶回家为国打战,非常好!本文一对N?错错错,本文,一对一!女强,男强,宝宝强!

  • 甜妻蜜语:帝少的宠妻大计

    甜妻蜜语:帝少的宠妻大计

        结婚数年,老公对她不仅冷眼相待,更是带了各种女人回家。她和他注定纠缠不清。为了复仇,她只能答应他的要求,各取所需。然而,当真相揭开的时候,她该何去何从?是选择相信,还是选择离开?“池琰,你明明不相信我,为什么不放过我?”男人却是紧紧扣住她的手,无比认真回答:“因为我爱你。”

  • 都市奇门神医

    都市奇门神医

    高磊作为上门女婿,尊严丧失,活的不如狗,他以为要窝囊到底,可命里注定他不会平凡。

  • 邪涩萌妻:踹了老公带球跑

    邪涩萌妻:踹了老公带球跑

    晚上八点整,陶夭动作利落地从停靠在马路上的一辆普通的私家车上跳了下来,准时出现在了苏世刚每天下班的必经之路上。根据哥哥陶然的调查,苏世刚每天这个时候都会准时出现在这里,在路边的同一家小店里买上一包烟,然后直奔夜场。苏世刚,是燕城,有权有势的高官。而陶夭今天的任务,就是要他的命!

  • 战神爸爸驾到

    战神爸爸驾到

    千古神将,灭六神,一人救一国,却救不了自己的女儿,他抛弃一切,最后的时间,只想陪在女儿身边,让她成为最幸福的人!

  • 猜你喜欢
    热门推荐
  • 白哾碧heyzo1031 字幕
  • 高中排列组合符号
  • 子轩教育集团招聘
  • pcie 功率
  • spnOverrides
  • 韩懿莹miss的老公
  • 有何炅的综艺节目
  • 古代动漫帅哥图片大全
  • arris路由器第3个灯闪
  • 人像转漫画风
  • 长佩app tid
  • 重庆喜联人天科技有限公司
  • 邮寄回来精灵少女gif
  • 酷派7605视频介绍
  • ipadpro9.7屏幕大小
  • 染色体大y严重吗
  • 3dmax2015版本
  • spring事务几种方式
  • 谁替代baby上跑男
  • 别克新英朗座套
  • All Right Reserved 知识库