当前位置:首页 » 操作系统 » linuxio进程

linuxio进程

发布时间: 2025-01-29 03:13:08

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

您好,很高兴为您解答。服务器cpu使用率不高,load比较高,所以要查看一下IO。硬盘IO可以通过命令vmstat或iostat获得(也可以用yum安装dstat获得),网络IO可以用iftop命令获取。但是不知道那个进程使用硬盘IO比较高,通过查找没有找到相关命令,只好自己写个脚本进行统计处理。本脚本在CentOS6下(kernel2.6以上)python2.6测试通过。直接运行脚本,默认情况下收集3秒钟数据,显示读写最高的前三个进程。如用参数可以使用命令“pythonfhip.py453”,第一个数位每次收集读写数据的间隔秒数,第二个数是打印出读写最多的n个进程,第三个为运行脚本的次数。因为参数部分写的比较简单那,所以用参数必须3个全写。。#!/bin/python#-*-coding:utf-8-*-#Filename:ind_high_io_process#Revision:1.0#Date:2013-3-8#Author:simonzhang#web:#######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_tmpdefmain(_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=0try: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_pidres+=""*(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_pidres+=""*(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]printresprint"\n"*1if__name__=='__main__':try:_sleep_time=sys.argv[1]except:_sleep_time=3try:_num=sys.argv[2]except:_num=3try:loop=sys.argv[3]except:loop=1foriinrange(int(loop)):main(int(_sleep_time),int(_num))如若满意,请点击【采纳答案】,如若还有问题,请点击【追问】希望我的回答对您有所帮助,望采纳!~O(∩_∩)O~

B. linux怎样查看那个进程占用网络io

查看linux进程占用端口步骤如下:

  1. lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具。以root用户来执行lsof -i命令,如下图


    C. 如何查看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 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_mp')
    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_mp')
    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 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz
    # 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 moles
    # make moles_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 http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
    # tar xzvf Python-2.7.2.tgz
    # cd Python-2.7.2
    # ./configure
    # make; make install
    下载并安装iotop:
    # wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.bz2
    # tar -xjvf iotop-0.4.4.tar.bz2
    # cd iotop-0.4.4
    # python setup.py build
    # python setup.py install
    然后就可以使用iotop看到如下图所示的信息:

热点内容
朗行选哪个配置 发布:2025-01-30 12:59:19 浏览:220
安卓转苹果的用户适合什么游戏 发布:2025-01-30 12:59:18 浏览:758
python书籍推荐知乎 发布:2025-01-30 12:57:52 浏览:632
android输入法自动弹出 发布:2025-01-30 12:57:39 浏览:34
循环码编译码实验的心得体会 发布:2025-01-30 12:53:15 浏览:674
烟能解压码 发布:2025-01-30 12:34:06 浏览:853
vbnet字符串加密 发布:2025-01-30 12:21:56 浏览:458
帝国3存储 发布:2025-01-30 12:18:47 浏览:849
压缩句子的题 发布:2025-01-30 12:07:33 浏览:803
文件夹侧面标签尺寸 发布:2025-01-30 12:00:36 浏览:97