• 查看磁盘IO负载


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

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

    1. lsof命令

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

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

    输出含义解释:

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

      

    常用参数:

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

      

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

    gddg:~ # lsof -p 32597
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
    bash    32597 root  cwd    DIR  202,2     4096  16097 /root
    bash    32597 root  rtd    DIR  202,2     4096      2 /
    bash    32597 root  txt    REG  202,2   584016  32203 /bin/bash
    bash    32597 root  mem    REG  202,2   293936   8125 /lib64/libncurses.so.5.6
    bash    32597 root  mem    REG  202,2  1661454   8057 /lib64/libc-2.11.1.so
    bash    32597 root  mem    REG  202,2    19114   8063 /lib64/libdl-2.11.1.so
    bash    32597 root  mem    REG  202,2   263568   8153 /lib64/libreadline.so.5.2
    bash    32597 root  mem    REG  202,2   149797   8050 /lib64/ld-2.11.1.so
    bash    32597 root  mem    REG  202,2   217016  16498 /var/run/nscd/passwd
    bash    32597 root  mem    REG  202,2   256324 149503 /usr/lib/locale/en_US.utf8/LC_CTYPE
    bash    32597 root  mem    REG  202,2       54 149490 /usr/lib/locale/en_US.utf8/LC_NUMERIC
    bash    32597 root  mem    REG  202,2     2454 133112 /usr/lib/locale/en_US.utf8/LC_TIME
    bash    32597 root  mem    REG  202,2  1163682 149504 /usr/lib/locale/en_US.utf8/LC_COLLATE
    bash    32597 root  mem    REG  202,2      286 133111 /usr/lib/locale/en_US.utf8/LC_MONETARY
    bash    32597 root  mem    REG  202,2       57 149408 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
    bash    32597 root  mem    REG  202,2       34 149428 /usr/lib/locale/en_US.utf8/LC_PAPER
    bash    32597 root  mem    REG  202,2       77 149438 /usr/lib/locale/en_US.utf8/LC_NAME
    bash    32597 root  mem    REG  202,2      155 133108 /usr/lib/locale/en_US.utf8/LC_ADDRESS
    bash    32597 root  mem    REG  202,2       59 149407 /usr/lib/locale/en_US.utf8/LC_TELEPHONE
    bash    32597 root  mem    REG  202,2       23 149429 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
    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信息。详细解释

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

      

    3. block_dump

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

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

      

    输出如下:

    pdflush(10423): 4000
    nginx(1167): 179
    nginx(1229): 172
    nginx(1187): 111
    nginx(1243): 105
    nginx(1213): 92
    nginx(1233): 69
    nginx(1157): 61
    nginx(1161): 50
    nginx(1155): 32
    

      

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

    sudo -s
    dmesg -c
    /etc/init.d/klogd stop
    echo 1 > /proc/sys/vm/block_dump
    rm /tmp/disklog
    watch "dmesg -c >> /tmp/disklog"
       CTRL-C when you're done collecting data
    echo 0 > /proc/sys/vm/block_dump
    /etc/init.d/klogd start
    exit (quit root shell)
    
    cat /tmp/disklog | awk -F"[() 	]" '/(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/

  • 相关阅读:
    Nginx优化
    FastCGI与PHP
    企业级Nginx服务基础到架构优化详解
    nginx优化的一些建议
    nginx的web缓存服务环境部署记录
    Linux下针对服务器网卡流量和磁盘的监控脚本
    Nginx软件优化
    并不对劲的spoj1811
    并不对劲的后缀自动机
    并不对劲的后缀数组
  • 原文地址:https://www.cnblogs.com/Alexr/p/9385880.html
走看看 - 开发者的网上家园