原文:http://www.cnblogs.com/cloudstorage/archive/2012/11/11/2764623.html

今天晚上发现服务器io有点高,顺带看看哪些进程在读写磁盘。

1. lsof命令

用 lsof 查看某块磁盘上的读写进程

  1. gddg:~ # lsof /dev/xvda2 |head
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. init 1 root cwd DIR 202,2 4096 2 /
  4. init 1 root rtd DIR 202,2 4096 2 /
  5. init 1 root txt REG 202,2 40784 193218 /sbin/init
  6. init 1 root mem REG 202,2 19114 8063 /lib64/libdl-2.11.1.so
  7. init 1 root mem REG 202,2 1661454 8057 /lib64/libc-2.11.1.so
  8. init 1 root mem REG 202,2 236384 8114 /lib64/libsepol.so.1
  9. init 1 root mem REG 202,2 113904 8115 /lib64/libselinux.so.1
  10. init 1 root mem REG 202,2 149797 8050 /lib64/ld-2.11.1.so
  11. kthreadd 2 root cwd DIR 202,2 4096 2 /

输出含义解释:

  1. COMMAND:进程的名称
  2. PID:进程标识符
  3. USER:进程所有者
  4. FD:文件描述符,应用程序通过文件描述符识别该文件。如cwdtxt
  5. TYPE:文件类型,如DIRREG
  6. DEVICE:指定磁盘的名称
  7. SIZE:文件的大小
  8. NODE:索引节点(文件在磁盘上的标识)
  9. NAME:打开文件的确切名称
  10.  
  11. FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。
  12.  
  13. 其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
  14.  
  15. FD 列相比,Type 列则比较直观。文件和目录分别称为 REG DIR。而CHR BLK,分别表示字符和块设备;或者 UNIXFIFO IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

  

常用参数:

  1. lsof `which httpd` //那个进程在使用apache的可执行文件
  2. lsof /etc/passwd //那个进程在占用/etc/passwd
  3. lsof /dev/hda6 //那个进程在占用hda6
  4. lsof /dev/cdrom //那个进程在占用光驱
  5. lsof -c sendmail //查看sendmail进程的文件使用情况
  6. lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
  7. lsof -p 30297 //显示那些文件被pid为30297的进程打开
  8. lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
  9.  
  10. lsof -u1000 //查看uid是100的用户的进程的文件使用情况
  11. lsof -utony //查看用户tony的进程的文件使用情况
  12. lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
  13. lsof -i //显示所有打开的端口
  14. lsof -i:80 //显示所有打开80端口的进程
  15. lsof -i -U //显示所有打开的端口和UNIX domain文件
  16. lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
  17. lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
  18. lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数

  

然后可以通过 lsof -p $pid 查看详情

  1. gddg:~ # lsof -p 32597
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. bash 32597 root cwd DIR 202,2 4096 16097 /root
  4. bash 32597 root rtd DIR 202,2 4096 2 /
  5. bash 32597 root txt REG 202,2 584016 32203 /bin/bash
  6. bash 32597 root mem REG 202,2 293936 8125 /lib64/libncurses.so.5.6
  7. bash 32597 root mem REG 202,2 1661454 8057 /lib64/libc-2.11.1.so
  8. bash 32597 root mem REG 202,2 19114 8063 /lib64/libdl-2.11.1.so
  9. bash 32597 root mem REG 202,2 263568 8153 /lib64/libreadline.so.5.2
  10. bash 32597 root mem REG 202,2 149797 8050 /lib64/ld-2.11.1.so
  11. bash 32597 root mem REG 202,2 217016 16498 /var/run/nscd/passwd
  12. bash 32597 root mem REG 202,2 256324 149503 /usr/lib/locale/en_US.utf8/LC_CTYPE
  13. bash 32597 root mem REG 202,2 54 149490 /usr/lib/locale/en_US.utf8/LC_NUMERIC
  14. bash 32597 root mem REG 202,2 2454 133112 /usr/lib/locale/en_US.utf8/LC_TIME
  15. bash 32597 root mem REG 202,2 1163682 149504 /usr/lib/locale/en_US.utf8/LC_COLLATE
  16. bash 32597 root mem REG 202,2 286 133111 /usr/lib/locale/en_US.utf8/LC_MONETARY
  17. bash 32597 root mem REG 202,2 57 149408 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
  18. bash 32597 root mem REG 202,2 34 149428 /usr/lib/locale/en_US.utf8/LC_PAPER
  19. bash 32597 root mem REG 202,2 77 149438 /usr/lib/locale/en_US.utf8/LC_NAME
  20. bash 32597 root mem REG 202,2 155 133108 /usr/lib/locale/en_US.utf8/LC_ADDRESS
  21. bash 32597 root mem REG 202,2 59 149407 /usr/lib/locale/en_US.utf8/LC_TELEPHONE
  22. bash 32597 root mem REG 202,2 23 149429 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
  23. bash 32597 root mem REG 202,2 26050 149293 /usr/lib64/gconv/gconv-modules.cache

  

2. cat /proc/$pid/io

如果内核版本大于2.6.20,通过cat /proc/pid/io 便可以获取进程的io信息。详细解释

  1. gddg:~ # cat /proc/4140/io
  2. rchar: 197448798054 // 读出的总字节数,read()或者pread()中的长度参数总和(pagecache中统计而来,不代表实际磁盘的读入)
  3. wchar: 209896059897 // 写入的总字节数,write()或者pwrite()中的长度参数总和
  4. syscr: 6491904 // read()或者pread()总的调用次数
  5. syscw: 13633940 // write()或者pwrite()总的调用次数
  6. read_bytes: 49616125952 // 实际从磁盘中读取的字节总数
  7. write_bytes: 14038130688 // 实际写入到磁盘中的字节总数
  8. cancelled_write_bytes: 2473984 // 由于截断pagecache导致应该发生而没有发生的写入字节数

  

3. block_dump

通过echo 1 > /proc/sys/vm/block_dump ,来把 block 读写(WRITE/READ/DIRTY)状况 dump 到日志里,通过 dmesg 命令来查看

  1. #!/bin/sh
  2.  
  3. /etc/init.d/syslog stop
  4. echo 1 > /proc/sys/vm/block_dump
  5.  
  6. sleep 60
  7. dmesg | awk '/(READ|WRITE|dirtied)/ {process[$1]++} END {for (x in process) \
  8. print process[x],x}' |sort -nr |awk '{print $2 " " $1}' | \
  9. head -n 10
  10. #dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z]*)' | sort | uniq -c | sort -rn |
  11. head
  12.  
  13. echo 0 > /proc/sys/vm/block_dump
  14. /etc/init.d/syslog start

  

输出如下:

  1. pdflush(10423): 4000
  2. nginx(1167): 179
  3. nginx(1229): 172
  4. nginx(1187): 111
  5. nginx(1243): 105
  6. nginx(1213): 92
  7. nginx(1233): 69
  8. nginx(1157): 61
  9. nginx(1161): 50
  10. nginx(1155): 32

  

或者参考这段代码吧:
http://stackoverflow.com/questions/249570/how-can-i-record-what-process-or-kernel-activity-is-using-the-disk-in-gnu-linux

  1. sudo -s
  2. dmesg -c
  3. /etc/init.d/klogd stop
  4. echo 1 > /proc/sys/vm/block_dump
  5. rm /tmp/disklog
  6. watch "dmesg -c >> /tmp/disklog"
  7. CTRL-C when you're done collecting data
  8. echo 0 > /proc/sys/vm/block_dump
  9. /etc/init.d/klogd start
  10. exit (quit root shell)
  11.  
  12. cat /tmp/disklog | awk -F"[() \t]" '/(READ|WRITE|dirtied)/ {activity[$1]++} END {for (x in activity) print x, activity[x]}'| sort -nr -k2

  

参考:

http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html

http://blog.csdn.net/guoguo1980/article/details/2324454

http://www.vpsee.com/2009/08/monitor-process-io-activity/

查看磁盘IO负载 - 看哪些进程在读写磁盘的更多相关文章

  1. 转 查看磁盘IO负载 - 看哪些进程在读写磁盘 以及oracle 异步I/O 和同步I/O

    https://www.cnblogs.com/cloudstorage/archive/2012/11/11/2764623.html #####sample 1: Oracle等待事件db fil ...

  2. 针对系统中磁盘IO负载过高的指导性操作

    针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...

  3. 磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作

    磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参 ...

  4. 磁盘io负载查看

    转自:http://blog.csdn.net/i_am_jojo/article/details/7698458 为了方便各位和自己今后遇到此类问题能尽快解决,我这里将查看linux服务器硬盘IO访 ...

  5. 集群瓶颈为什么是磁盘io

    阅读本文思考: 1.对磁盘IO了解多少 2.为什么是磁盘IO是瓶颈,有没有自己的答案 想了解磁盘io可以查看此帖:集群瓶颈:磁盘IO必读 (磁盘IO:磁盘输出输出) 集群的瓶颈提出多种看法,其中网络和 ...

  6. 磁盘 IO 和网络 IO 该如何评估、监控、性能定位和优化?

    生产中经常遇到一些IO延时长导致的系统吞吐量下降.响应时间慢等问题,例如交换机故障.网线老化导致的丢包重传:存储阵列条带宽度不足.缓存不足.QoS限制.RAID级别设置不当等引起的IO延时. 一.评估 ...

  7. IO负载高的来源定位

    前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到IO负载的来源进程和来源文件导致无法进行相应的策略来解决问题. 这个现象在MySQ ...

  8. iotop,pt-ioprofile : mysql IO负载高的来源定位

    http://www.cnblogs.com/cenalulu/archive/2013/04/12/3016714.html 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(i ...

  9. IO负载高的来源定位 IO系列

    http://elf8848.iteye.com/category/281637 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到 ...

随机推荐

  1. scala学习笔记(1)

    scala ------------------------- java语言脚本化 1.安装scala-2.12.1.msi 2.进入到scala的命令行 3.Tab键会有补全的功能 1.scala程 ...

  2. 使用 dataset 管理数据(官网)

    ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射.这在不少场景下能带来使用上的方便. ECharts ...

  3. redis、rabitmq对比

    redis.rabitmq对比 原文地址 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性 ...

  4. 简单Delphi程序设计

  5. 一文看懂HttpServletResponse

    https://www.jianshu.com/p/8bc6b82403c5 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的resp ...

  6. SecureCRT文件和文件夹显示不同颜色(像linux中那样效果)

    如何设置secureCRT使用的他可以像linux文件和文件夹显示不同的颜色呢 原先显示效果如下: 效果图 配置

  7. YARN组件详细介绍

    一.ResourceManager 内部主要有两个组件: 1.Scheduler:这个组件完全是插拔式的,用户可以根据自己的需求实现不同的调度器,目前YARN提供了FIFO.容量以及公平调度器.这个组 ...

  8. CreateRemoteThread

    CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程(也称:创建远程线程)..

  9. bootstrap-table给每一行数据添加按钮,并绑定事件

    https://blog.csdn.net/mht1829/article/details/72633100 https://blog.csdn.net/qq_39215166/article/det ...

  10. 关于Python你不得不知道的Python语言特点

    首先什么是语言?什么是编程? 准确来说是:定义计算机程序的语言,用来向计算机发送指令 个人理解:   语言:是一种交流的工具或者方式.比如我们的汉语普通话.各地的方言.外语中的英语.俄语.日语等.我们 ...