linux io进程(linux如何查看io使用率)

大家好,感谢邀请,今天来为大家分享一下linux io进程的问题,以及和linux如何查看io使用率的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

linux 系统查看哪个进程占io

lsof是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

常用的参数列表

lsof filename显示打开指定文件的所有进程

lsof-a表示两个参数都必须满足时才显示结果

lsof-c string显示COMMAND列中包含指定字符的进程所有打开的文件

lsof-u username显示所属user进程打开的文件

lsof-g gid显示归属gid的进程情况

lsof+d/DIR/显示目录下被进程打开的文件

lsof+D/DIR/同上,但是会搜索目录下的所有目录,时间相对较长

lsof-d FD显示指定文件描述符的进程

lsof-n不将IP转换为hostname,缺省是不加上-n参数

lsof-i用以显示符合条件的进程情况

lsof-i[46] [protocol][@hostname|hostaddr][:service|port]

46--> IPv4 or IPv6

protocol--> TCP or UDP

hostname--> Internet host name

hostaddr--> IPv4地址

service-->/etc/service中的 service name(可以不只一个)

port-->端口号(可以不只一个)

怎么查看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

###ENDINITINFO

importos

importre

importsys

importtime

fromstringimportstrip

####

sys_proc_path='/proc/'

re_find_process_number='^\d+$'

####

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

####

defcollect_info():

_tmp={}

re_find_process_dir=re.compile(re_find_process_number)

foriinos.listdir(sys_proc_path):

ifre_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_infoinrw_io:

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

ifstrip(cut_info[0])=="read_bytes":

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

ifstrip(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

defmain(_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()

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

forloopinprocess_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"pidprocessread(bytes)pidprocesswrite(btyes)"

for_numinrange(_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]

printres

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

foriinrange(int(loop)):

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

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

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

~ O(∩_∩)O~

如何查看Linux下进程的IO活动状况 00 Hey,Linux

前段时间,几台测试服务器的Web应用响应速度非常慢,系统负载也比较高,> 10,但CPU和内存却很闲,于是怀疑是磁盘的性能瓶颈,通过vmstat和iostat看到IO的读写量非常大,尤其是用iostat-x 1命令可以很直观的看到IO的使用率一直在100%。

但究竟是什么进程导致的高IO呢,由于每台服务器上都有JBoss和MySQL的存在,JBoss会不停的产生很多小的数据文件和生成文本数据库的数据,而MySQL则会不停的从Master同步新的数据。因此我们怀疑是这两个进程导致的高IO,通过停止了JBoss和MySQL之后,IO立刻降为0%.但我们还是不能确定谁是主因,于是寻找可以查看特定进程IO的方法。

最后,找到了两个方法可以查看进程IO的活动状况。

1.第一个方法是通过一个python脚本来实现。

方法是将以下内容另存为一个叫io.py的脚本中,然后直接以root身份执行脚本,就可以看到如下图所示的信息(由于我们已经通过升级到SSD硬盘解决了MySQL的IO问题,所以不能提供关于MySQL的截图了),其中出现次数最多,数据最大的进程,就是导致高IO的主因。不过比较遗憾的是这个脚本并不能显示进程在每一秒的准确的IO读写。

# vim io.py

# chmod+x io.py

#./io.py

#!/usr/bin/python

# Monitoring per-process disk I/O activity

# written by

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()

2.另一个方法是将Linux的内核升级到>=2.6.20,然后安装一个iotop软件来实现。

不过这种改动并不适用于生产环境,因为在RHEL5.6和5.7上,内核都在 2.6.20以下。但是它所显示的结果是非常准确的,所以对于新上线的机器以及测试环境,非常值得一试,具体方法如下:

下载和升级新内核(>=2.6.20),编译时打开 TASK_DELAY_ACCT和 TASK_IO_ACCOUNTING选项。

解压内核后进入配置界面:

# wget

# tar jxvf linux-2.6.39.tar.gz

# mv linux-2.6.39/usr/src/

# cd/usr/src/linux-2.6.39

# make oldconfig//使用make oldconfig可以继承老的kernel的配置,为自己的配置省去很多麻烦。

# make menuconfig

把General setup- Enable per-task storage I/O accounting这个选项选上。

# vim.config

将#CONFIG_SYSFS_DEPRECATED_V2 is not set的注释去掉的,将其改为y,即修改为CONFIG_SYSFS_DEPRECATED_V2=y。

保存内核后编译内核:

# make

# make modules

# make modules_install

# make install

修改默认以新的内核启动:

# vi/boot/grub/grub.conf

default=0

将新的内核配置文件复制到/boot目录:

# cp/usr/src/linux-2.6.39/.config/boot/config-2.6.39

重启服务器:

# reboot

# uname–r

2.6.39

重启完成后确认内核版本是否正确。

源码安装iotop所需的Python 2.7.2(>= 2.5):

# wget

# tar xzvf Python-2.7.2.tgz

# cd Python-2.7.2

#./configure

# make; make install

下载并安装iotop:

# wget

# tar-xjvf iotop-0.4.4.tar.bz2

# cd iotop-0.4.4

# python setup.py build

# python setup.py install

然后就可以使用iotop看到如下图所示的信息:

阅读剩余
THE END